Отправьте объект JSON с Android на PHP-сервер с помощью метода POST и HttpURLConnection

Я пытаюсь установить связь между моим Android-приложением и моим WampServer в локальной сети.

Когда я хочу читать данные с сервера, у меня был успех, но у меня проблема при попытке отправить данные на сервер.

Я использую Службу для установления связи:

public class SynchronisationService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); new Thread(new Runnable() { @Override public void run() { try { URL url = new URL("http://192.168.37.23/happiness_barometer/php_input.php"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setDoInput(false); connection.setRequestMethod("POST"); connection.connect(); OutputStream outputStream = connection.getOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(outputStream); JSONObject jsonObject = new JSONObject(); jsonObject.put("rate", 1); writer.write(URLEncoder.encode(jsonObject.toString(), "UTF-8")); writer.flush(); writer.close(); } catch (Exception e) { Log.v("EXCEPTION", e.getMessage()); } } }).start(); stopSelf(); return flags; } 

}

И мой php-файл:

  <?php try { $bdd = new PDO('mysql:host=localhost;dbname=happiness_barometer;charset=utf8', 'utilisateur', ''); } catch (Exception $e) { die('Erreur : '.$e->getMessage()); } $sql = $bdd->prepare( 'INSERT INTO rates (rate, comment, category, day, month, year, hour, minute, day_of_week, week, rate_number) VALUES (:rate, :comment, :category, :day, :month, :year, :hour, :minute, :day_of_week, :week, :rate_number)'); if (!empty($_POST['rate'])) { $sql->execute(array( 'rate' => $_POST['rate'], 'comment' => '', 'category' => 'pro', 'day' => 19, 'month' => 8, 'year' => 2015, 'hour' => 18, 'minute' => 3, 'day_of_week' =>3, 'week' => 33, 'rate_number' => 2)); } ?> 

Когда я запускаю свое приложение, в мою базу данных ничего не добавляется. Я думаю, что нет ничего в $_POST['rate'] .

Пожалуйста, скажите мне, что не так в моем коде?

Наконец, мне удалось отправить JSONObject на мой сервер.

Я использовал этот код для части Android:

 new Thread(new Runnable() { @Override public void run() { OutputStream os = null; InputStream is = null; HttpURLConnection conn = null; try { //constants URL url = new URL("http://192.168.43.64/happiness_barometer/php_input.php"); JSONObject jsonObject = new JSONObject(); jsonObject.put("rate", "1"); jsonObject.put("comment", "OK"); jsonObject.put("category", "pro"); jsonObject.put("day", "19"); jsonObject.put("month", "8"); jsonObject.put("year", "2015"); jsonObject.put("hour", "16"); jsonObject.put("minute", "41"); jsonObject.put("day_of_week", "3"); jsonObject.put("week", "34"); jsonObject.put("rate_number", "1"); String message = jsonObject.toString(); conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout( 10000 /*milliseconds*/ ); conn.setConnectTimeout( 15000 /* milliseconds */ ); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); conn.setFixedLengthStreamingMode(message.getBytes().length); //make some HTTP header nicety conn.setRequestProperty("Content-Type", "application/json;charset=utf-8"); conn.setRequestProperty("X-Requested-With", "XMLHttpRequest"); //open conn.connect(); //setup send os = new BufferedOutputStream(conn.getOutputStream()); os.write(message.getBytes()); //clean up os.flush(); //do somehting with response is = conn.getInputStream(); //String contentAsString = readIt(is,len); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } finally { //clean up try { os.close(); is.close(); } catch (IOException e) { e.printStackTrace(); } conn.disconnect(); } } }).start(); 

и этот в php-части:

 $json = file_get_contents('php://input'); $obj = json_decode($json); $rate = $obj->{'rate'}; $comment = $obj->{'comment'}; $category = $obj->{'category'}; $day = $obj->{'day'}; $month = $obj->{'month'}; $year = $obj->{'year'}; $hour = $obj->{'hour'}; $minute = $obj->{'minute'}; $day_of_week = $obj->{'day_of_week'}; $week = $obj->{'week'}; $rate_number = $obj->{'rate_number'}; try { $bdd = new PDO('mysql:host=localhost;dbname=happiness_barometer;charset=utf8', 'utilisateur', ''); } catch (Exception $e) { die('Erreur : '.$e->getMessage()); } $sql = $bdd->prepare( 'INSERT INTO rates (rate, comment, category, day, month, year, hour, minute, day_of_week, week, rate_number) VALUES (:rate, :comment, :category, :day, :month, :year, :hour, :minute, :day_of_week, :week, :rate_number)'); if (!empty($rate)) { $sql->execute(array( 'rate' => $rate, 'comment' => $comment, 'category' => $category, 'day' => $day, 'month' => $month, 'year' => $year, 'hour' => $hour, 'minute' => $minute, 'day_of_week' => $day_of_week, 'week' => $week, 'rate_number' => $rate_number)); } 

Надеюсь, это поможет кому-то еще;)

Проверьте этот код:

 public class UniversalNetworkConnection { public static String postJSONObject(String myurl, JSONObject parameters) { HttpURLConnection conn = null; try { StringBuffer response = null; URL url = new URL(myurl); conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(10000); conn.setConnectTimeout(15000); conn.setRequestProperty("Content-Type", "application/json"); conn.setDoOutput(true); conn.setRequestMethod("POST"); OutputStream out = new BufferedOutputStream(conn.getOutputStream()); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8")); writer.write(parameters.toString()); writer.close(); out.close(); int responseCode = conn.getResponseCode(); System.out.println("responseCode" + responseCode); switch (responseCode) { case 200: BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); return response.toString(); } } catch (IOException ex) { ex.printStackTrace(); } finally { if (conn != null) { try { conn.disconnect(); } catch (Exception ex) { ex.printStackTrace(); } } } return null; } } 

на стороне PHP:

 <?php $json = file_get_contents('php://input'); $obj = json_decode($json); print_r($obj); print_r("this is a test"); ?>