【问题标题】:What is a correct way to send an array in POST request using Volley?使用 Volley 在 POST 请求中发送数组的正确方法是什么?
【发布时间】:2017-04-07 06:11:45
【问题描述】:

当我使用 Postman 时,我使用下面的请求描述从服务器获得正确的响应(服务器将“类别”作为数组处理):

带有标题:

此请求具有以下原始表示:

POST /api/items HTTP/1.1
Host: www1.
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
Postman-Token: c18f92ee-2f36-f4dd-2963-6bc6d1db0bdf

items=247642&categories%5B%5D=12&categories%5B%5D=11

我的问题是如何使用 Volley 库来表示描述的请求以正确触发它。我尝试了很多变体,例如:

@Override
public byte[] getBody() throws AuthFailureError {
    return "items=247642&categories%5B%5D=12".getBytes();
}

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    Map<String,String> headers = super.getHeaders();
    headers.put("Content-Type", "application/x-www-form-urlencoded");
    return headers;
}

但是它们要么不将“类别”编码为数组(所以服务器根本不考虑这个变量)或者以不正确的方式进行编码,所以服务器无法获取这个数组的值。

更新:

我刚刚尝试使用 OkHttp 触发这个请求,它是绝对正确的(就像上面的 Postman 一样):

MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
            RequestBody body = RequestBody.create(mediaType, "items=247642&categories%5B%5D=10&categories%5B%5D=9");
            Request request = new Request.Builder()
                    .url("http://www1...")
                    .post(body)
                    .addHeader("content-type", "application/x-www-form-urlencoded")
                    .addHeader("cache-control", "no-cache")
                    .build();

这仅意味着一件事:Volley 以其他方式处理原始请求主体(可能是不正确的方式),或者 Volley 中缺少一些微妙的配置来正确执行此类请求。

【问题讨论】:

    标签: android post request android-volley


    【解决方案1】:

    我应该承认问题中描述的问题主要基于服务器的逻辑。通过从 Volley 和 OkHttp 转储请求正文并逐步比较它们,我可以发现它们仅在一个标头中存在差异 - Content-Type。在 OkHttp 中它看起来像:

    Content-Type: application/x-www-form-urlencoded; charset=utf-8
    

    在 Volley 中是:

    Content-Type: application/x-www-form-urlencoded, application/x-www-form-urlencoded; charset=UTF-8
    

    所以看起来这是对服务器上标头的一种严格检查。为了使 Volley 的标头与 OkHttp 的标头相同,我必须在请求中删除对 getHeaders() 方法的覆盖,并在 getBodyContentType() 方法中返回正文类型描述:

    @Override
    public String getBodyContentType() {
        return "application/x-www-form-urlencoded";
    }
    

    我不能说我的问题已经完全解决,因为关于如何使用更优雅的方式(没有原始正文和其他格式 - 例如 JSON)在 POST 请求正文中添加数组仍有更多答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 2017-09-18
      • 2014-09-23
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多