当前位置: 首页 > 知识库问答 >
问题:

HttpURLConnection向Apache/PHP发送JSON POST请求

温嘉玉
2023-03-14

我在纠结HttpURLConnection和OutputStreamWriter。

代码实际上到达了服务器,因为我确实得到了有效的错误响应。发出POST请求,但服务器端未接收到数据。

任何关于正确使用这种东西的提示都是非常感谢的。

代码在异步任务中

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;


?>

以及 Android Studio 中的 logcat 输出:

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}

如果我附加<code>?action=login到URLI可以从服务器获得成功响应。但只有动作参数在服务器端注册。

{“成功”:真,“消息”:“欢迎”,“请求”:“登录”}

结论必须是,<code>URLConnection.write(output.getBytes(“UTF-8”))不会传输任何数据

好吧,毕竟数据传输。

@greenaps提供的解决方案达到了目的:

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

上面的PHP脚本已更新以显示解决方案。

共有3个答案

林劲
2023-03-14

我让服务器告诉我它从我那里得到了什么。

请求标头和POST正文

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

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

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

像魅力一样工作)

颛孙嘉石
2023-03-14

尝试使用DataOutputStream而不是OutputStriamWriter。

        DataOutputStream out = new DataOutputStream(_conn.getOutputStream());
        out.writeBytes(your json serialized string);
        out.close();
齐学文
2023-03-14
echo (file_get_contents('php://input'));

将向您显示json文本。像这样使用它:

$jsonString = file_get_contents('php://input');
$jsonObj = json_decode($jsonString, true);
 类似资料:
  • 问题内容: 我在HttpURLConnection和OutputStreamWriter方面挣扎。 代码实际上到达了服务器,因为我确实收到了有效的错误响应。发出了POST请求,但服务器端未收到任何数据。 正确使用此东西的任何提示均受到高度赞赏。 该代码在AsyncTask中 我正在尝试发送的JSON: 我从服务器得到的响应: 我应该得到的回应是: 服务器端PHP脚本: 以及Android Stud

  • 我有这个代码: 当为 true(执行 POST 或 PUT 请求)时,此代码会引发 IOException,并且不会完成请求。我尝试对 重新排序、编写调用和流创建块,但没有排列工作。 在所有情况下,BufferedReader都工作得很好,不会抛出任何异常。< code>getQuery正确返回URL编码的字符串。 以下是来自IOExc的堆栈跟踪: 最终发生的是请求通过,但没有一个POST或PUT

  • 问题内容: 我已经开发了一个Java代码,该代码使用URL和HttpUrlConnection将以下cURL转换为Java代码。卷曲是: 我已经编写了此代码,但是它始终会给HTTP代码400错误的请求。我找不到丢失的内容。 问题答案: 你的JSON不正确。代替 写 因此,JSONObject.toString()应该只为外部对象调用一次。 另一件事(可能不是你的问题,但我想提一下): 为确保不会遇

  • 问题内容: 我想使用对服务器进行一些API调用。但是请求未成功,返回: 因此,我想检查发送到服务器的“真实”内容是什么。实际内容是指确切的HTTP请求。 有什么想法可以看到吗? 编辑: 根据此处的第一个答案,我应该澄清我的问题:我想避免使用外部程序(例如HTTP嗅探器)或其他任何东西,而我希望有一个函数或一个属性或任何包含我要查找的信息的东西。 如果不是这种情况,有人知道该信息是否可以手动重建(例

  • 我已经写了这段代码,但它总是给HTTP代码400错误的请求。我找不到丢失的东西。

  • 问题内容: 我想知道是否可以将PUT,DELETE请求(实际上)发送java.net.HttpURLConnection到基于HTTP的URL。 我已经读了很多描述如何发送GET,POST,TRACE,OPTIONS请求的文章,但是我仍然没有找到成功执行PUT和DELETE请求的示例代码。 问题答案: 要执行HTTP PUT: 要执行HTTP删除: