2015-12-26 2 views
1

У меня возникли проблемы с отправкой запроса POST на веб-сервер из приложения для Android. Я создал страницу, которая принимает параметр POST «данные» со строковым значением, и я проверил, что он работает с расширением Google Chrome Postman. Однако, когда я пытаюсь отправить данные из приложения Android, я всегда получаю неверный код ответа HTTP, как если бы данные вообще не передавались на сервер.Android POST на сервер всегда возвращает код ложного ответа

private void sendDataToServer(final String uri, final String data) { 
    Log.d("Debug", "MainActivity -> sendDataToServer (start)"); 
    Thread t = new Thread() { 
     public void run() { 

      try { 
       // Set up connection 
       Log.d("Debug", uri); 
       HttpURLConnection urlConnection = (HttpURLConnection) ((new URL(uri).openConnection())); 
       urlConnection.setRequestMethod("POST"); 
       urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
       urlConnection.setDoInput(true); 
       urlConnection.setDoOutput(true); 
       urlConnection.connect(); 

       // Write 
       OutputStreamWriter writer = new OutputStreamWriter(urlConnection.getOutputStream()); 
       Log.d("Debug", data); 
       writer.write("data=" + data); 
       writer.close(); 

       // Read 
       int responseCode = urlConnection.getResponseCode(); 

       Log.d("Debug", String.valueOf(responseCode)); 

       if (responseCode == 200) { 
        Log.d("Debug", "Message sending: Success!"); 
        // TODO: Do something with the results 
       } else { 
        Log.d("Debug", "Message sending: Failure..."); 
       } 

       urlConnection.disconnect(); 

      } catch (UnsupportedEncodingException e) { 
       Log.d("Debug", e.getMessage()); 
      } catch (IOException e) { 
       Log.d("Debug", e.getMessage()); 
      } 

     } 
    }; 
    t.start(); 
    Log.d("Debug", "MainActivity -> sendDataToServer (end)"); 
} 

код веб-сервера:

$postData = $_POST['data'];//file_get_contents("php://input"); 

if ($postData) { 

    $connection = connectToDB(); 

    $array = json_decode($postData); 

    foreach ($array as $element) { 
    addMessage($connection, $element->timestamp, $element->sender, $element->message); 
    } 

    disconnectFromDB($connection); 

    http_response_code(200); 

} else { 

    http_response_code(400); 

} 

Что я могу сделать, чтобы исправить это поведение? Я запускаю Android Lollipop.

+0

Что такое код ответа вы получите? –

+0

@abdulrahmank Точный код ответа не имеет значения. В настоящее время я просто возвращаю код HTTP-ответа (отличный от 200) с сервера, если он не получает соответствующую строку в качестве переменной POST. Тем не менее, я проверил с расширением Postman, что строка формата, переданного в приложении, должна быть принята. – wolx

ответ

2

Поскольку вы используете "Content-Type", "application/x-www-form-urlencoded" поэтому я предлагаю вам обратиться к моему пример кода, как:

private class POSTRequest extends AsyncTask<Void, Void, String> { 

     @Override 
     protected String doInBackground(Void... voids) { 
      String address = "http://..."; 
      HttpURLConnection urlConnection; 
      String requestBody; 
      Uri.Builder builder = new Uri.Builder(); 
      Map<String, String> params = new HashMap<>(); 
      params.put("key1", "value1"); 
      params.put("key2", "value2");    

      // encode parameters 
      Iterator entries = params.entrySet().iterator(); 
      while (entries.hasNext()) { 
       Map.Entry entry = (Map.Entry) entries.next(); 
       builder.appendQueryParameter(entry.getKey().toString(), entry.getValue().toString()); 
       entries.remove(); 
      } 
      requestBody = builder.build().getEncodedQuery(); 

      try { 
       URL url = new URL(address); 
       urlConnection = (HttpURLConnection) url.openConnection(); 
       urlConnection.setDoOutput(true); 
       urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
       OutputStream outputStream = new BufferedOutputStream(urlConnection.getOutputStream()); 
       BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8")); 
       writer.write(requestBody); 
       writer.flush(); 
       writer.close(); 
       outputStream.close(); 

       InputStream inputStream; 
       // get stream 
       if (urlConnection.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) { 
        inputStream = urlConnection.getInputStream(); 
       } else { 
        inputStream = urlConnection.getErrorStream(); 
       } 
       // parse stream 
       BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
       String temp, response = ""; 
       while ((temp = bufferedReader.readLine()) != null) { 
        response += temp; 
       } 
       // do something...     

       return response; 
      } catch (IOException | JSONException e) { 
       return e.toString(); 
      } 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      Log.i(LOG_TAG, "POST\n" + result); 
     } 
    } 

UPDATE:

Я только что протестировал и получил 200 код ответа со следующим:

Android (я жестко закодировать данные):

... 
Map<String, String> params = new HashMap<>(); 
params.put("data","[{\"timestamp\":\"2015-12-26 07:02:00.557\", \"sender\":\"58576402\", \"message\":\"4\"}]"); 
... 

PHP:

<?php 
$postData = file_get_contents("php://input"); // $_POST['data'];//file_get_contents("php://input"); 
if ($postData) { 
    //$array = json_decode($postData); 
    http_response_code(200); 
} else { 
    http_response_code(400); 
} 
?> 
+0

У меня все еще такая же проблема. Я получаю код ответа, который я указал для ошибочного результата (400), и данные не передаются на веб-сервер (я знаю, потому что в противном случае строки данных добавляются в базу данных веб-сервера). Когда я использую Postman и передаю одни и те же данные, он передается правильно. Я также получаю ту же проблему при использовании исходного типа содержимого. – wolx

+0

Pls публикует ваш снимок экрана Postman – BNK

+0

http://imgur.com/hlqQUtY Код ответа 200 и строки данных были добавлены в базу данных на веб-сервере. Я использую те же данные, что и в приложении для Android. – wolx