java 通过 HttpURLConnection POST JSON 数据时出现 HTTP 错误 400 Bad Request
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/26996679/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
HTTP error 400 Bad Request when POSTing JSON data over HttpURLConnection
提问by StrikeNeo
I have this code below that trying to post JSON data after successfully authenticate through Oauth2.0, the code is like this:
我在下面有这段代码,试图在通过 Oauth2.0 成功验证后发布 JSON 数据,代码是这样的:
try {
URL url = new URL ("https://test.api.neteller.com/v1/oauth2/token?grant_type=client_credentials");
String test = "QUFBQlNhVlFoUjhlTVhPQjowLm9aV3g2Rkhwd1dIQUZnXzRaMDZwOUoyRWtzaXVHMHEzd2xrVFF4MkRVM28uN0FzUDE4cmZXU0dxVDdqWE1NUGhzSFY4cHU0";
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setRequestProperty ("Authorization", "Basic " + test);
String accessToken = "";
[... get the access token ...]
String urlnew = "https://test.api.neteller.com/v1/transferIn";
URL obj = new URL(urlnew);
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
//add request header
con.setRequestMethod("POST");
con.setDoOutput(true);
con.setRequestProperty ("Authorization", "Bearer " + accessToken);
con.setRequestProperty("Content-Type", "application/json");
// Send post request
JSONObject obj2 = new JSONObject();
obj2.put("paymentMethod", "");
obj2.put("type", "neteller");
obj2.put("value", "[email protected]");
obj2.put("transaction", "");
obj2.put("merchantRefId", "20140203122501");
obj2.put("amount", (5000));
obj2.put("currency", "USD");
obj2.put("verificationCode", "411392");
System.out.print(obj2);
int responseCode = con.getResponseCode();
System.out.println("Response Code : " + responseCode);
[... parse response ...]
} catch(Exception e) {
e.printStackTrace();
}
I get this error when I run the code above:
运行上面的代码时出现此错误:
java.io.IOException: Server returned HTTP response code: 400 for URL: https://test.api.neteller.com/v1/transferIn
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
at example.demo.main(demo.java:71)
Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: https://test.api.neteller.com/v1/transferIn
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
at example.demo.main(demo.java:65)
From the error status 400 I know that the post JSON data is invalid. I suspect maybe in the structure because according to the documentation it should be like this:
从错误状态 400 我知道后 JSON 数据无效。我怀疑可能在结构中,因为根据文档它应该是这样的:
{
"paymentMethod": {
"type": "neteller",
"value": "[email protected]"
},
"transaction": {
"merchantRefId": "20140203122501",
"amount": 5000,
"currency": "USD"
},
"verificationCode": "234124"
}
So how do I change the JSON parameter so that it could follow the structure in the documentation?
那么如何更改 JSON 参数以使其遵循文档中的结构?
回答by guido
For the required data scheme, like this:
对于所需的数据方案,如下所示:
JSONObject obj2 = new JSONObject();
JSONObject paymentMethod = new JSONObject();
paymentMethod.put("type", "neteller");
paymentMethod.put("value", "[email protected]");
obj2.put("paymentMethod", paymentMethod);
JSONObject transaction = new JSONObject();
transaction.put("merchantRefId", "20140203122501");
transaction.put("amount", (5000));
transaction.put("currency", "USD");
obj2.put("transaction", transaction);
obj2.put("verificationCode", "411392");
For writing in the outputStream of the connection (the payload of the POST):
用于写入连接的 outputStream(POST 的有效负载):
BufferedWriter out =
new BufferedWriter(new OutputStreamWriter(con.getOutputStream()));
out.write(obj2.toString());
out.close();
the above, beforereading the responseCode.
以上,在阅读responseCode之前。