2015-08-20 19 views
6

Próbuję nawiązać komunikację między moją aplikacją na Androida a moim serwerem WampServer w sieci lokalnej.Wysyłanie obiektu JSON z systemu Android do serwera PHP za pomocą metody POST i HttpURLConnection

Kiedy chcę odczytać dane z serwera, odniosłem sukces, ale mam problem, gdy próbuję wysłać dane na serwer.

Używam Service do ustanowionego komunikatem:

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

}

A mój plik 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)); 
    } 
?> 

Kiedy uruchamiam moją aplikację, nic nie dodaje do mojego Baza danych. Myślę, że nie ma nic w $_POST['rate'].

Proszę, powiedz mi, co jest nie tak w moim kodzie?

+0

można zamieścić swoje ślad stosu (logcat) –

+0

@vinay Maneti: Mam około 200 linii w moim logcat. Które linie są ważne? –

+0

które są powiązane z twoją Usługą synchronizacji i klasami aktywności –

Odpowiedz

13

Wreszcie sukces wysłać JSONObject do mojego serwera.

Użyłem tego kodu dla android część:

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

i ten jeden w ramach 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)); 
} 

nadzieję, że to pomoże ktoś inny;)

+0

to bardzo mi pomogło! merci tres bien, tu m'as sauvé. UPVOTED:) –

+0

@ Anaïs Używam tego samego kodu, co odpowiedź, którą otrzymuję httpUrlConnection.getResponse() to HttpURLConnection.HTTP_OK, ale php nie przyjmuje danych json. Proszę pomóż – Yirga

1

Sprawdź z tym kodem:

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

} 

na PHP Side:

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

Próbuję tego kodu, ale nic się też nie stało: nie ma wyjątku, bez błędów, nic o System.out w logcat. –

+0

@ Anaïs Sprawdź na wamp -> apache -> dziennik dostępu. Sprawdź, czy połączenie zostało ustanowione. – Bonatti

+0

@Bonatti I Sprawdź dziennik dostępu, plik php_output jest "otwarty" przez klienta w sieci lokalnej (adres ip: 192.168.36.212), ale plik php_input nigdy nie jest "otwarty". Uważam też, że błąd 408 wydaje mi się. Czy to pomocne? –

Powiązane problemy