【问题标题】:Getting 411 response code while getting JSON Response获取 JSON 响应时获取 411 响应代码
【发布时间】:2013-06-18 17:51:36
【问题描述】:

在我的应用程序中,我正在尝试使用 POST 请求获取响应。响应服务器以 Json 格式发送给我。但是在添加属性之后,它会将响应代码返回为 411(即内容长度问题)。 我已经添加了内容长度。那么我没有得到的问题在哪里。这是我的代码:

String url = "https://xxx:8243/people/v3";
STRURL = url + HttpComm.getConnectionString().trim();

StringBuffer postData = new StringBuffer();
HttpConnection httpConnection = null;
try {
    httpConnection = (HttpConnection) Connector.open(STRURL);
} catch (IOException e1) {
    e1.printStackTrace();
};

try {
    httpConnection.setRequestMethod("POST");
    postData.append("?username="+user);
    postData.append("&password="+password);
    String encodedData = postData.toString();
    byte[] postDataByte = postData.toString().getBytes("UTF-8");
    httpConnection.setRequestProperty("Authorization", "bearer"+"ZWOu3HL4vwaOLrFAuEFqsxNQf6ka");
    httpConnection.setRequestProperty("Content-Type","application/json");
    httpConnection.setRequestProperty("Content-Length", String.valueOf(postDataByte.length));
    OutputStream out = httpConnection.openOutputStream();
    DataOutputStream dos = new DataOutputStream(out);
    out.write(postData.toString().getBytes());
    out.flush();
    int statusCode = httpConnection.getResponseCode();
    Logger.out("HttpComm", "status code:::::::   "+statusCode);
    if (statusCode != HttpConnection.HTTP_OK)
    {

    }

更新代码:

HttpConnection httpConnection = null;
    try {
        httpConnection = (HttpConnection) Connector.open(STRURL);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    };
            try {
                httpConnection.setRequestMethod("POST");
                URLEncodedPostData postData = new URLEncodedPostData("UTF-8", false);
                 postData.append("username", user);
                 postData.append("password", password);
                 byte[] postDataByte = postData.getBytes();
                  httpConnection.setRequestProperty("Authorization", "bearer"+"ZWOu3HL4vwaOLrFAuEFqsxNQf6ka");
                   httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                   httpConnection.setRequestProperty("Content-Length", String.valueOf(postDataByte.length));
                   OutputStream out = httpConnection.openOutputStream(); 
                   out.write(postDataByte);
                   out.flush();

                   int statusCode = httpConnection.getResponseCode();
                   Logger.out("HttpComm", "status code:::::::   "+statusCode);

【问题讨论】:

  • 肯定out.write(postData.toString().getBytes())不正确,应该是out.write(postDataByte)

标签: java json blackberry http-headers


【解决方案1】:

这里有些东西看起来不太对劲。我建议您试试这个:

 httpConnection.setRequestMethod("POST");

 URLEncodedPostData postData = new URLEncodedPostData("UTF-8", false);
 postData.append("username", user);
 postData.append("password", password);
 byte[] postDataByte = postData.getBytes();

 httpConnection.setRequestProperty("Authorization", "bearer"+"ZWOu3HL4vwaOLrFAuEFqsxNQf6ka");
 httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
 httpConnection.setRequestProperty("Content-Length", String.valueOf(postDataByte.length));

 OutputStream out = httpConnection.openOutputStream(); 
 DataOutputStream dos = new DataOutputStream(out);
 out.write(postDataByte);
 out.flush();

 int statusCode = httpConnection.getResponseCode();
 Logger.out("HttpComm", "status code:::::::   "+statusCode);
 if (statusCode != HttpConnection.HTTP_OK)

我改变了什么:

  1. 正如@samlewis 所说,代码正在创建一个变量来保存发布数据字节,但在调用out.write() 时并未使用它。

  2. 代码将内容类型设置为 JSON,但不是发送 JSON。请求只是两个参数。响应可能是 JSON,但您没有在请求的 Content-Type 参数中指定。

  3. 用户名/密码参数仅使用字符串进行编码。通常最好使用URLEncodedPostDatato hold your POST parameters

  4. 如果要使用字符串,我认为在用户名参数前面添加? 仍然不正确。如果要在GET URL 中编码参数,则使用https://xxx:8243/people/v3?username=user&password=password。但是,这段代码使用的是 POST,而不是 GET。

  5. 还有一个未使用的encodedData 变量。

【讨论】:

  • 我已经按照你说的修改了代码。但我仍然得到相同的响应:411。但是当我在浏览器中输入这个 url 时,我得到了正确的 JSON 响应。 api.yookos.com:8243/people/…
  • @Arindam,您有可以在此处共享的此服务器的 test 用户名和密码吗?没有它,我无法为你测试这个,我不确定我还能做些什么来提供帮助。您应该进行我在答案中发布的更改,但也总是有可能出现其他问题。谢谢。
  • 我可以给你 JSON 响应,而不是给你测试用户和密码,这是我在桌面浏览器中点击 URL 后得到的。会好吗?
  • @Arindam,如果您有 JSON 响应,是的,最好编辑您的问题并将其放入其中。但是,我认为这无助于调试 411 错误代码。
  • @Arindam,throw 'allowIllegalResourceCall is false.'; 是什么?那不是 JSON。我也有点困惑。如果服务器返回那个大的 JSON 响应,它不工作吗?你期待不同的东西吗?你是说你得到了一个411 错误代码,但你得到了这个JSON?
猜你喜欢
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 2011-08-10
  • 2018-06-13
  • 2018-02-27
相关资源
最近更新 更多