使用Volley在POST请求中发送数组的正确方法是什么?

时间:2017-04-07 06:11:46

标签: android post request android-volley

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

带标题的

Postman request headers

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

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;
}

但是所有这些都不会将“类别”编码为数组(因此服务器根本不会考虑此变量)或以不正确的方式进行编码,因此服务器无法获取此数组的值。 / p>

更新

我刚尝试使用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中有一些微妙的配置缺少正确执行此类请求。

1 个答案:

答案 0 :(得分:0)

我应该承认问题中描述的问题主要基于服务器的逻辑。通过从Volley和OkHttp转储请求主体并逐步比较它们,我发现它们只在一个标题中有区别 - Content-Type。在OkHttp中它看起来像:

Content-Type: application/x-www-form-urlencoded; charset=utf-8
在排球时,它是:

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";
}

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