如何禁止字符集自动添加到 okhttp 中的内容类型
2022-09-02 12:46:27
请考虑以下代码:
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("text/plain; charset=utf-8"); // [A]
RequestBody body = RequestBody.create(mediaType, media);
String[] aclHeader = "x-goog-acl:public-read".split(":");
Request request = new Request.Builder()
.addHeader("Content-Type", "text/plain") // [B]
.addHeader(aclHeader[0], aclHeader[1])
.url(url)
.put(body)
.build();
Response response = client.newCall(request).execute();
我从客户端访问 GCS,使用的是以前签名的 URL。
问题:似乎还可以http将为正文[A]声明的字符集也添加到URL中(至少对于文本/纯文本),即使它没有在[B]中声明。这搞砸了我的签名URL,GCS返回403 Forbidden。
- 如果我从[A]中删除字符集,它仍然被添加。
- 如果我在签名之前将字符集添加到签名的URL中,它可以工作,GCS返回200 OK。
但事实并非如此。至少在使用签名 URL 时,这些 URL 必须完全按照声明的方式发送到服务器。
我尝试使用Apache http客户端(我不想在生产中使用它,因为okhttpclient已经是我安装的一部分),并且该客户端不会公开此行为:
String[] aclHeader = "x-goog-acl:public-read".split(":");
StatusLine statusLine = Request
.Put(url)
.addHeader("Content-Type", "text/plain")
.addHeader(aclHeader[0], aclHeader[1])
.bodyByteArray(media)
.execute().returnResponse().getStatusLine();
有没有办法抑制 okhttp 中的行为,即它添加到内容类型或冗余传输正文中的内容类型?