2014-08-29 17 views
9

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?

Trả lời

16

Tôi tìm thấy giải pháp:

Các dòng sau là thủ phạm:

RequestBody body = RequestBody.create(mediaType, media); 

tạo có 3 chữ ký cho phương tiện truyền thông:

  • Chuỗi
  • byte []
  • Tệp

Khi tôi chuyển một chuỗi, nó bỏ qua mediaType đã cung cấp và thêm bộ ký tự vào nó. Ngay cả đối với hình ảnh/jpeg, nó sẽ gửi

image/jpeg; charset = utf-8

tới máy chủ.

Sử dụng byte [] hoặc Tệp loại bỏ hành vi đó.

Tôi hy vọng điều này sẽ giúp ích cho bạn!

[ngốc tôi - vì đơn giản tôi đã cho nó một chuỗi thời gian thử nghiệm, như tôi đã không quan tâm đến cơ thể ;-(].

+1

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! –

+0

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. –

Các vấn đề liên quan