2015-04-16 11 views
7

Ich habe Probleme mit HttpURLConnection und OutputStreamWriter. Der Code erreicht tatsächlich den Server, da ich einen gültigen Fehler Antwort zurück bekomme. Es wird eine POST-Anforderung gestellt, aber es werden keine Daten serverseitig empfangen.HttpURLConnection senden JSON POST-Anfrage an Apache/PHP

Alle Hinweise zur richtigen Verwendung dieses Dings werden sehr geschätzt.

Der Code ist in einem AsyncTask

protected JSONObject doInBackground(Void... params) {         
    try {                    
     url = new URL(destination);              
     client = (HttpURLConnection) url.openConnection();        
     client.setDoOutput(true);              
     client.setDoInput(true);               
     client.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
     client.setRequestMethod("POST");             
     //client.setFixedLengthStreamingMode(request.toString().getBytes("UTF-8").length); 
     client.connect();                

     Log.d("doInBackground(Request)", request.toString());       

     OutputStreamWriter writer = new OutputStreamWriter(client.getOutputStream()); 
     String output = request.toString();            
     writer.write(output);               
     writer.flush();                 
     writer.close();                 

     InputStream input = client.getInputStream();          
     BufferedReader reader = new BufferedReader(new InputStreamReader(input));  
     StringBuilder result = new StringBuilder();          
     String line;                  

     while ((line = reader.readLine()) != null) {          
      result.append(line);               
     }                    
     Log.d("doInBackground(Resp)", result.toString());        
     response = new JSONObject(result.toString());         
    } catch (JSONException e){               
     this.e = e;                  
    } catch (IOException e) {               
     this.e = e;                  
    } finally {                   
     client.disconnect();                
    }                     

    return response;                  
}                      

Die JSON Ich versuche zu senden:

JSONObject request = { 
    "action":"login", 
    "user":"mogens", 
    "auth":"b96f704fbe702f5b11a31524bfe5f136efea8bf7", 
    "location":{ 
     "accuracy":25, 
     "provider":"network", 
     "longitude":120.254944, 
     "latitude":14.847808 
     } 
    }; 

Und die Antwort, die ich von dem Server erhalten:

JSONObject response = { 
    "success":false, 
    "response":"Unknown or Missing action.", 
    "request":null 
    }; 

Und die Antwort, die ich hätte haben sollen:

JSONObject response = { 
    "success":true, 
    "response":"Welcome Mogens Burapa", 
    "request":"login" 
    }; 

Die serverseitige PHP-Skript:

<?php 

    $json = file_get_contents('php://input'); 
    $request = json_decode($json, true); 

    error_log("JSON: $json"); 

    error_log('DEBUG request.php: ' . implode(', ',$request)); 
    error_log("============ JSON Array ==============="); 
    foreach ($request as $key => $val) { 
     error_log("$key => $val"); 
    } 

    switch($request['action']) 
    { 
     case "register": 

      break; 
     case "login": 
      $response = array(
          'success' => true, 
          'message' => 'Welcome ' . $request['user'], 
          'request' => $request['action'] 
         ); 
      break; 
     case "location": 

      break; 
     case "nearby": 

      break; 
     default: 
      $response = array(
          'success' => false, 
          'response' => 'Unknown or Missing action.', 
          'request' => $request['action'] 
         ); 
      break; 
    } 

    echo json_encode($response); 

    exit; 


?> 

Und die logcat Ausgabe in Android Studio:

D/doInBackground(Request)﹕ {"action":"login","location":{"accuracy":25,"provider":"network","longitude":120.254944,"latitude":14.847808},"user":"mogens","auth":"b96f704fbe702f5b11a31524bfe5f136efea8bf7"} 
D/doInBackground(Resp)﹕ {"success":false,"response":"Unknown or Missing action.","request":null} 

Wenn ich ?action=login zum URL anhängen kann ich einen Erfolg Antwort vom Server erhalten. Aber nur die Aktion Parameter registriert serverseitig.

{"success":true,"message":"Welcome ","request":"login"}

Die Schlussfolgerung muss sein, dass keine Daten von URLConnection.write(output.getBytes("UTF-8")); übertragen

Nun, Daten schließlich übertragen bekommen.

Lösung von @greenaps angeboten funktioniert der Trick:

$json = file_get_contents('php://input'); 
$request = json_decode($json, true); 

PHP-Skript über die Lösung aktualisiert, um anzuzeigen.

+1

Zeigen Sie Ihre PHP-Skript bitte. – greenapps

+0

'Die JSON, die ich senden möchte: request = {'. Nein. Anfrage, aber request.toString() sollte das sein. Was ist die Art von "Anfrage"? Unterlassen Sie Typen nicht. – greenapps

+0

@greenapps Die PHP ist ziemlich einfach '$ request = $ _REQUEST; \t $ post = $ _POST; \t \t error_log ('DEBUG request.php:'. Implode (',', $ Anfrage)); \t error_log ("REQUEST ============ ==============="); \t while (Liste ($ key, $ val) = jeder ($ _ REQUEST)) { \t error_log ("$ key => $ val"); \t} ' –

Antwort

6
echo (file_get_contents('php://input')); 

Werden Sie den json Text zeigen. Arbeiten Sie damit wie:

$jsonString = file_get_contents('php://input'); 
$jsonObj = json_decode($jsonString, true); 
+0

Du bist mein neuer Held. Das war, was ich vermisste. Jetzt erhalte ich die Propper Antwort: '{ "Erfolg": true, "message": "Welcome mogens", "Anforderung": "login"}' Vielen Dank. –

+0

Unten ist meine Antwort mit Kopfzeilen und POST Body – Inoy

1

versuchen, DataOutputStream anstelle von OutputStreamWriter zu verwenden.

 DataOutputStream out = new DataOutputStream(_conn.getOutputStream()); 
     out.writeBytes(your json serialized string); 
     out.close(); 
+0

Gleiches Ergebnis Keine Daten erreichen den Server Sowohl $ _REQUEST als auch $ _POST sind leer Server-Seite. –

+0

@MogensBurapa Okay ... derzeit in meiner Anwendung verwende ich diesen Code ... \t \t \t _conn = (HttpURLConnection) neue URL (this._url) .openConnection(); _conn.setRequestMethod ("POST"); _conn.setUseCaches (falsch); _conn.setDoOutput (wahr); und der obige Code ... es funktioniert perfekt für mich. Bitte versuche dies und lass es mich wissen – Sri777

+0

Also, der einzige Unterschied ist die ** setUseCaches (falsch) ** Richtig? Gleiches Ergebnis. Nichts auf dem Server. –

0

Ich habe Server gemacht sagen Sie mir, was es von mir bekam.

Anfrage Header und POST Körper

<?php 
    $requestHeaders = apache_request_headers(); 
    print_r($requestHeaders); 

    print_r("\n -= POST Body =- \n"); 

    echo file_get_contents('php://input'); 
?> 

wirkt wie ein Zauber)

Verwandte Themen