【问题标题】:post data to server using Java, like jQuery's $.post()使用 Java 将数据发布到服务器,例如 jQuery 的 $.post()
【发布时间】:2014-08-20 17:41:32
【问题描述】:

我有一个 Web 后端,可以与以下 jQuery 帖子一起使用:

$.post(path + "login",
       {"params": {"mode":"self", "username": "aaa", "password": "bbb"}},
       function(data){
                console.log(data);
            }, "json");

如何使用 HttpURLConnection 从 Java 实现相同的 POST?我正在尝试

URL url = new URL(serverUrl + loginUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Content-Length",
    Integer.toString(postData.getBytes().length));
connection.setRequestProperty("Content-Language", "en-US");
connection.setUseCaches (false);
connection.setDoInput(true);
connection.setDoOutput(true);
DataOutputStream wr =
    new DataOutputStream(connection.getOutputStream ());
wr.writeBytes(postData);
wr.flush ();
wr.close ();
BufferedReader br =
    new BufferedReader(
        new InputStreamReader(connection.getInputStream()));

,其中postData = "{\"mode\": \"...\", ..... }"

但它的工作方式不同。

服务器上的代码写id为django,并尝试通过这种方式获取数据:

mode=request.POST.get("params[mode]")

【问题讨论】:

  • 什么意思不一样?你想让它做什么?它的作用是什么?
  • 它将一些数据发布到网络服务器,我想以字符串形式获取响应。当我尝试将它与具有上述 jQuery 函数的 HTML 页面一起使用时,它可以工作。但我无法从 Java 重新创建相同的发布请求。
  • 它返回 HTTPError 500,因为服务器上的代码无法从请求中获取数据,它想要...

标签: java post httpurlconnection


【解决方案1】:

您似乎一直在想 jQuery 以原始格式将 JSON 发送到服务器,并且 HTTP 服务器完美地理解它。这不是真的。 HTTP 请求参数的默认格式为application/x-www-form-urlencoded,与 HTTP 网站中的 HTML 表单使用的格式完全相同,也与 URL 中的 GET 查询字符串的格式完全相同:name1=value1&name2=value2

换句话说,jQuery 不会将未经修改的 JSON 发送到服务器。 jQuery 只是将它们透明地转换为真正的请求参数。在正常的浏览器中按 F12 并检查 HTTP 流量监视器也应该向您显示这一点。您在$.post 末尾指定的"json" 参数只是告诉jQuery 服务器返回 的数据格式(因此不告诉它使用哪种数据格式)。

所以,就像 jQuery 在幕后所做的一样:

String charset = "UTF-8";
String mode = "self";
String username = "username";
String password = "bbb";
String query = String.format("%s=%s&%s=%s&%s=%s",
    URLEncoder.encode("param[mode]", charset), URLEncoder.encode(mode, charset),
    URLEncoder.encode("param[username]", charset), URLEncoder.encode(username, charset),
    URLEncoder.encode("param[password]", charset), URLEncoder.encode(password, charset));

// ... Now create URLConnection.

connection.setDoOutput(true); // Already implicitly sets method to POST.
connection.setRequestProperty("Accept-Charset", charset);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);

try (OutputStream output = connection.getOutputStream()) {
    output.write(query.getBytes(charset));
}

// ... Now read InputStream.

注意:不要使用Data(Input|Output)Stream!这些用于创建/读取.dat 文件。

另见:

【讨论】:

    【解决方案2】:

    您应该使用高效的库来构建(有效的)json 对象。这是 PrimeFaces 库中的一个示例:

    private JSONObject createObject() throws JSONException {
        JSONObject object = new JSONObject();
        object.append("mode", "...");
        return object;
    }
    

    如果您希望有一个漂亮而简洁的代码来发送和检索对象,请查看 Emil Adz 的答案 (Sending Complex JSON Object)。

    【讨论】:

    • 我应该将此 JSONObject 添加到 HttpURLConnection,但是如何?
    • 我试过writer.write(object.toString(),但没有发送我想要的数据。
    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2015-10-07
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    相关资源
    最近更新 更多