Как связать приложение Android со страницей PHP?

#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-запросов. Таким образом, это не решит проблему.