当我使用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;
}
但是所有这些都不会将“类别”编码为数组(因此服务器根本不会考虑此变量)或以不正确的方式进行编码,因此服务器无法获取此数组的值。 / 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中有一些微妙的配置缺少正确执行此类请求。
答案 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)