web-dev-qa-db-fra.com

HttpURLConnection envoyant du JSON POST demande à Apache/PHP

Je me bats avec HttpURLConnection et OutputStreamWriter.

Le code parvient effectivement au serveur, car je reçois une erreur valide En réponse. Une demande POST est effectuée, mais aucune donnée n'est reçue Côté serveur.

Toute allusion à un usage correct de cette chose est très appréciée.

Le code est dans une tâche asynchrone

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

Le JSON que j'essaye d'envoyer:

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

Et la réponse que je reçois du serveur:

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

Et la réponse que j'aurais dû avoir:

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

Le script PHP côté serveur:

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


?>

Et la sortie logcat dans 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}

Si j'ajoute ?action=login à la URL, je peux obtenir une réponse positive du serveur. Mais seul le paramètre action enregistre côté serveur.

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

La conclusion doit être qu'aucune donnée n'est transférée par URLConnection.write(output.getBytes("UTF-8")); 

Eh bien, les données sont transférées après tout.

La solution proposée par @greenaps fait l'affaire:

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

Le script PHP ci-dessus a été mis à jour pour afficher la solution.

8
Mogens TrasherDK
echo (file_get_contents('php://input'));

Je vais vous montrer le texte JSON. Travaille avec comme:

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

J'ai fait en sorte que le serveur me dise ce que cela m'a apporté.

En-têtes de demande et POST Body

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

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

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

Fonctionne comme un charme)

1
Inoy

essayez d'utiliser DataOutputStream au lieu de OutputStreamWriter.

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

Le code parvient effectivement au serveur, car je reçois une réponse d'erreur valide . Une demande POST est effectuée, mais aucune donnée n'est reçue Côté serveur.

obtenu cette même situation, et venez à @greenapps répondre. vous devriez savoir quel serveur a été reçu par 'post request'

ce que je fais en premier côté serveur: 

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

puis imprimer/Toast/afficher la réponse du message côté client. assurez-vous que sa forme correcte, comme:

{"username": "yourusername", "password" : "yourpassword"}

si la réponse ressemble à ceci (parce que vous postez la demande avec yourHashMap.toString()):

{username=yourusername,password=yourpassword}

au lieu d'utiliser .toString (), utilisez cette méthode pour convertir HashMap en String:

private String getPostDataString(HashMap<String, String> postDataParams) {
        StringBuilder result = new StringBuilder();
        boolean first = true;
        for (Map.Entry<String,String> entry :   postDataParams.entrySet()){
            if(first){
                first = false;
            }else{
                result.append(",");
            }
            result.append("\"");
            result.append(entry.getKey());
            result.append("\":\"");
            result.append(entry.getValue());
            result.append("\"");
        }
        return "{" + result.toString() + "}";
    }
0
Muchtarpr