2015-08-20 2 views
6

Я пытаюсь установить связь между моим Android-приложением и моим WampServer в локальной сети.Отправить объект JSON с Android на PHP-сервер с методом POST и HttpURLConnection

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

Я использую службу в установленном сообщении:

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'].

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

+0

вы можете разместить ваш трассировка стека (logcat) –

+0

@vinay Maneti: У меня около 200 строк в моем логарифме. Какие строки важны? –

+0

, которые связаны с вашими классами SynchronisationService и активностью –

ответ

13

Наконец, я успешно отправить JSONObject к моему серверу.

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

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)); 
} 

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

+0

Мне это очень помогло! merci tres bien, tu m'as sauvé. UPVOTED:) –

+0

@ Anaïs Я использую тот же код, ответ я получаю httpUrlConnection.getResponse() является HttpURLConnection.HTTP_OK, но php не принимает данные json. Пожалуйста помоги – Yirga

1

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

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"); 
?> 
+0

Я пробую этот код, но ничего не произошло: исключение, никаких ошибок, ничего о System.out в logcat. –

+0

@ Anaïs Проверка на wamp -> apache -> журнал доступа. Проверьте, не установлено ли соединение – Bonatti

+0

@Bonatti I Проверьте журнал доступа, файл php_output «открыт» клиентом в локальной сети (IP-адрес: 192.168.36.212), но файл php_input никогда не «открыт». Я также считаю ошибку 408, я думаю. Это полезно? –

Смежные вопросы