web-dev-qa-db-ja.com

JSONを送信するHttpURLConnection POSTリクエストをApache / PHPに送信

HttpURLConnectionとOutputStreamWriterで苦労しています。

有効なエラー応答が返されるので、コードは実際にサーバーに到達します。 POSTリクエストが送信されましたが、サーバー側でデータが受信されていません。

このことの適切な使用法へのヒントは高く評価されています。

コードは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;                                                                    
}                                                                                       
_

送信しようとしているJSON:

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

そして、私がサーバーから受け取る応答:

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

そして、私が持っていたはずの応答:

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

サーバーサイドPHPスクリプト:

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


?>
_

そして、logcatの出力は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}
_

_?action=login_をURLに追加すると、サーバーから成功応答を取得できます。ただし、actionパラメーターのみがサーバー側に登録されます。

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

結論は、URLConnection.write(output.getBytes("UTF-8"));によってデータが転送されないということでなければなりません。

結局、データは転送されます。

@greenapsによって提供されるソリューションはトリックを行います:

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

上記のPHPスクリプトは、解決策を示すために更新されました。

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

Jsonテキストが表示されます。次のように操作します。

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

私はサーバーにそれが私から得たものを教えてもらいました。

リクエストヘッダーとPOST本文

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

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

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

チャームのように機能します)

1
Inoy

outputStreamWriterの代わりにDataOutputStreamを使用してみてください。

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

有効なエラー応答が返されるので、コードは実際にサーバーに到達します。 POSTリクエストが行われ、ただし、サーバー側でデータは受信されません。

これと同じ状況になり、@ greenappsの回答に来てください。 'postrequest'からどのサーバーが受信したかを知っておく必要があります

サーバー側で最初に行うこと:

_echo (file_get_contents('php://input'));
_

次に、クライアント側でメッセージ応答を印刷/トースト/表示します。次のように、正しい形式であることを確認してください。

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

このような応答の場合(yourHashMap.toString()を使用してリクエストを投稿するため):

_{username=yourusername,password=yourpassword}
_

代わりに.toString()を使用し、代わりにこのメソッドを使用してHashMapを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