Xét đoạn mã sau:Làm thế nào để ngăn chặn Charset được tự động thêm vào Content-Type trong okhttp
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();
tôi truy cập vào GCS từ một khách hàng, với một URL đã ký trước đó.
Sự cố: Dường như okhttp cũng thêm bộ ký tự được khai báo cho nội dung [A] vào URL (ít nhất là đối với văn bản/đồng bằng), mặc dù nó không được khai báo trong [B]. Điều này làm lộn xộn URL đã ký của tôi và GCS trả về 403 Bị cấm.
- Nếu tôi xóa bộ ký tự khỏi [A], nó vẫn được thêm vào.
- Nếu tôi thêm bộ ký tự vào URL đã ký trước khi ký, nó hoạt động và GCS trả về 200 OK.
Nhưng điều này không đúng. Ít nhất khi làm việc với các URL đã ký, các URL này phải được gửi đến máy chủ chính xác như được khai báo.
tôi đã cố gắng sử dụng client Apache http (mà tôi không muốn sử dụng trong sản xuất như okhttpclient đã là một phần của cài đặt của tôi) và khách hàng mà không vạch trần hành vi này:
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();
Có cách để ngăn chặn hành vi trong okhttp, nó thêm vào Content-Type hoặc chuyển Content-Type trong cơ thể dư thừa?
Yup OkHttp cần phải quyết định làm thế nào để chuyển đổi chuỗi của bạn để byte, và khi Bằng cách này, tại sao bạn không chỉ định một bảng mã? Máy chủ có thể sử dụng chẩn đoán để đoán, và nó có thể đoán sai! –
Tôi hiểu, vâng, tôi đã không chỉ định bộ ký tự bởi vì tôi nghĩ một hình ảnh là nhị phân và tôi chỉ sử dụng String để nạp vào thứ gì đó. Tôi không quan tâm đến nội dung nên tôi cũng không quan tâm đến bộ ký tự. Nhưng tôi thừa nhận nó có ý nghĩa. –