当我通过POST请求将JSON对象发送到服务器时,服务器会返回错误消息。
代码:
public String sendStuff(String reqUrl,String arg1, String arg2){
String response;
try{
URL url = new URL(reqUrl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
JSONObject jsonObject = new JSONObject();
jsonObject.accumulate("argument1",arg1);
jsonObject.accumulate("argument2",arg2);
String json = jsonObject.toString();
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
out.writeBytes(URLEncoder.encode(json,"UTF-8"));
out.flush();
out.close();
int HttpResult = conn.getResponseCode();
if(HttpResult == HttpURLConnection.HTTP_OK){
response = convertStreamToString(conn.getInputStream());
return response;
}
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
private String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line;
try {
while ((line = reader.readLine()) != null) {
sb.append(line).append('\n');
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
错误讯息:
{" ERROR":" JSONObject文本必须以' {'在1 [字符2行1]"}
根据RESTful服务,只有在JSON格式错误时才会返回此错误消息。我已经通过Chrome扩展程序手动测试了该服务,它可以正常使用。
我认为不应该出错,因为我通过org.json
包中的方法直接将JSON转换为字符串。
我搜索了一个解决方案,但无法找到解决方案。
答案 0 :(得分:0)
尝试添加标题:
conn.setRequestProperty("Accept", "application/json");
conn.setRequestProperty("Content-Type", "application/json");
答案 1 :(得分:0)
您不需要对从String
返回的json.toString()
中的数据进行URLEncode编码。您应该只能将String
本身作为UTF-8编码的字节流进行流式传输。编码该对象的URL将转换特殊的JSON终端字符,例如' {'到它们的百分比编码等价物(例如%7B),这不适合HTTP请求的主体。
另一件需要考虑的事情是,你真的不需要DataOutputStream
来做这种事情 - 输出应该是代表UTF-8编码的json文档的字节流而{{{ 1}用于将Java原始对象转换为字节流。您已经有了字节流,因此您只需要将其发送到DataOuputStream
...
OutputStream