2017-04-07 78 views
3

当我使用邮差,我收到正确的响应(服务器进程“类别”作为阵列)使用以下请求描述从服务器: Postman request body使用Volley在POST请求中发送数组的正确方法是什么?

与标头: 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; 
} 

但他们要么都不编码“类别”为阵列(这样服务器不参与帐户在所有这些变量)或作出不正确的方式编码,所以服务器无法获得这个数组的值。

UPDATE:

我只是试着用OkHttp火这一要求,这是绝对正确的(如与情况邮差以上):

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中存在一些微妙的配置,无法正确执行这些请求。

回答

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 

所以看起来它是一种在服务器上的标题的严格检查。为了让排球的头等于OkHttp的,我不得不删除getHeaders()方法的重载的请求,并在getBodyContentType()方法返回身型描述:

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

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

相关问题