2015-08-20 8 views
6

Ich versuche, die Kommunikation zwischen meiner Android App und meinem WampServer im lokalen Netzwerk herzustellen.Senden Sie ein JSON-Objekt von Android zu PHP-Server mit POST-Methode und HttpURLConnection

Wenn ich Daten vom Server lesen möchte, hatte ich Erfolg, aber ich habe ein Problem, wenn ich versuche, Daten an den Server zu senden.

Ich bin mit einem Service eingerichtet, um die Kommunikation:

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

}

Und meine PHP-Datei:

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

Wenn ich meine Anwendung ausführen, wird nichts hinzugefügt meine Datenbank. Ich denke, es gibt nichts in der $_POST['rate'].

Bitte sagen Sie mir, was in meinem Code falsch ist?

+0

können Sie Ihre Post Stack-Trace (Logcat) –

+0

@vinay Maneti: Ich habe etwa 200 Zeilen in meinem Logcat. Welche Zeilen sind wichtig? –

+0

die sich auf Ihren SynchronisationsService und Ihre Aktivitätsklassen beziehen –

Antwort

13

Schließlich habe ich Erfolg einen JSONObject auf meinen Server zu senden.

habe ich diesen Code für das Android-Teil:

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

und diese in der PHP-Teil:

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

Hoffe, dass es jemand anderes helfen;)

+0

das hat mir sehr geholfen! merci tres bien, tu m'as sauvé. UPVOTED:) –

+0

@ Anaïs Ich benutze den gleichen Code die Antwort ich bekomme httpUrlConnection.getResponse() ist HttpURLConnection.HTTP_OK aber der PHP akzeptiert nicht die JSON-Daten. Bitte helfen Sie – Yirga

1

prüfen mit diesem Code:

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

} 

auf PHP-Seite:

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

Ich versuche diesen Code, aber es ist auch nichts passiert: keine Ausnahme, keine Fehler, nichts über System.out in logcat. –

+0

@ Anaïs Überprüfen Sie auf wamp -> Apache -> Zugriffsprotokoll. Überprüfen Sie, ob die Verbindung hergestellt wurde – Bonatti

+0

@Bonatti I Überprüfen Sie das Zugriffsprotokoll, die php_output-Datei ist "offen" von einem Client im lokalen Netzwerk (IP-Adresse: 192.168.36.212), aber die php_input-Datei ist nie "offen". Ich finde auch einen 408 Fehler, denke ich. Ist es hilfreich? –

Verwandte Themen