在进行POST调用时格式错误的JSON

时间:2016-12-24 02:13:03

标签: java android json rest post

当我通过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转换为字符串。

我搜索了一个解决方案,但无法找到解决方案。

2 个答案:

答案 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