#php #android
#php #Android
Вопрос:
Я пытаюсь отправить сообщение из простого приложения для Android и сохранить его на сервере.
Вот сервер
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Title...
</title>
</head>
<body>
<section style="text-align:center;">
<?php
$data = "";
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
ob_start();
var_dump($_POST['data']);
$message = ob_get_contents();
$my_file = 'file.txt';
$handle = fopen($my_file, 'w') or die('Cannot open file: '.$my_file);
fwrite($handle, $message);
fclose($handle);
}
?>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
message: <br/>
<input type="text" name="data" value="<?php echo $data;?>"><br/>
<input type="submit" name="submit" value="Submit">
</form>
</section>
</body>
</html>
Приложение такое же, как и первое приложение из https://developer.android.com/training/basics/firstapp/starting-activity плюс разрешение на доступ в Интернет и некоторый код для отправки сообщения
публичный класс DisplayMessageActivity расширяет AppCompatActivity {
private static final String myURL = "https://[mywebsite].000webhostapp.com/index.php";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
// Get the Intent that started this activity and extract the string
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
// Capture the layout's TextView and set the string as its text
TextView textView = findViewById(R.id.textView);
textView.setText(message);
URL url;
StringBuilder sb = new StringBuilder();
try {
url = new URL(myURL);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput( true );
conn.setDoInput( true );
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
HashMap<String, String> params = new HashMap<>();
params.put("data", message);
writer.write(getPostDataString(params));
writer.flush();
writer.close();
os.close();
int responseCode = conn.getResponseCode();
if (responseCode == HttpsURLConnection.HTTP_OK) {
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
sb = new StringBuilder();
String response;
while ((response = br.readLine()) != null) {
sb.append(response);
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException {
StringBuilder result = new StringBuilder();
boolean first = true;
for (Map.Entry<String, String> entry : params.entrySet()) {
if (first)
first = false;
else
result.append("amp;");
result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
result.append("=");
result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
}
return result.toString();
}
}
Страница сама по себе может создать ожидаемый файл, но приложение этого не делает, я пишу сообщение, нажимаю отправить, и оно показывает экран с сообщением без какой-либо дополнительной ошибки или исключения. Что я делаю не так?
РЕДАКТИРОВАТЬ: сетевая часть должна была быть выполнена в другом потоке
protected void onCreate(Bundle savedInstanceState) {
...
textView.setText(message);
callAsyncTask();
}
private void callAsyncTask() {
class ATaskCaller extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... voids) {
...
[network stuff]
...
}
}
ATaskCaller atc = new ATaskCaller();
atc.execute();
}
Комментарии:
1. Можете ли вы попытаться зарегистрировать входящие данные на стороне PHP? Должно быть достаточно простого
var_dump
или около того, чтобы проверить, есть ли вообще входящие данные и правильно ли они отформатированы.2. Никто не получает уведомления при редактировании сообщения, поэтому, пожалуйста, используйте комментарии 🙂 Итак, вы не получили никакого ответа от
var_dump
? Это будет означать, что сообщение не получено, поэтому приложение не отправляет запрос.3. Это как-то связано с этим blog.danlew.net/2010/07/23 / … ? есть ли какая-либо альтернатива HttpsURLConnection?
Ответ №1:
убедитесь, что ваш сервер принимает cors.
вы пытаетесь создать post, чтобы ваш сервер принял его. Заголовок ответа должен содержать:
Методы разрешения доступа: POST
Управление доступом-Разрешить-источник: *
https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Controle_Acesso_CORS
Комментарии:
1. вы имеете в виду что-то вроде этого? <? заголовок php(«Access-Control-Allow-Methods: POST»); заголовок(«Access-Control-Allow-Origin: *»);
2. CORS используется только в веб-браузерах и полностью игнорируется в других видах внутренних HTTP-запросов. Таким образом, это не решит проблему.