2014-10-29 14 views
10

Tôi đang cố chuyển một chuỗi định dạng bên dưới làm phần nội dung của yêu cầu bài đăng http.Ngăn chặn trang bị thêm từ mã hóa cơ thể yêu cầu http

param1=PARAM1&param2=PARAM2&param3=PARAM3 

Nhưng trang bị thêm mã hóa cơ thể của tôi để = trở thành \ u003d và & trở thành \ u0026. Và tôi kết thúc bằng một chuỗi thực sự trông như sau:

param1\u003dPARAM1\u0026param2\u003dPARAM2\u0026param3\u003dPARAM3 

Làm cách nào để ngăn chặn điều đó?

api còn lại được trang bị thêm của tôi được xác định như sau.

public interface RestAPI { 
    @POST("/oauth/token") 
    public void getAccessToken(@Body String requestBody, Callback<Response> response); 
} 

Trả lời

7

Để trả lời câu hỏi trực tiếp, bạn có thể sử dụng TypedString làm loại tham số phương thức. Lý do giá trị đang được thay đổi là vì Retrofit đang chuyển giao String thành Gson để mã hóa dưới dạng JSON. Sử dụng TypedString hoặc bất kỳ lớp con nào TypedOutput sẽ ngăn chặn hành vi này, về cơ bản nói cho Retrofit bạn sẽ tự xử lý việc tạo thân yêu cầu trực tiếp.

Tuy nhiên, định dạng tải trọng đó được gọi là mã hóa URL biểu mẫu. Retrofit có hỗ trợ riêng cho nó. khai phương pháp của bạn thực sự nên xem xét như thế này:

@FormUrlEncoded 
@POST("/oauth/token") 
void getAccessToken(
    @Field("param1") String param1, 
    @Field("param2") String param2, 
    @Field("param3") String param3, 
    Callback<Response> callback); 
+8

Tôi đang cố gắng ĐĂNG thân như lớp nhưng một số biến trong đó chứa chuỗi được mã hóa như "66PdGFKsvyyYaVTGJ/nAYQ ==" ... bất kỳ ý tưởng nào để ngăn các dấu = chuyển thành \ u003d – vezikon

8

Nếu bạn có một lớp serialized (như một HashMap) trong cơ thể yêu cầu và bạn muốn ngăn chặn mã hóa đó (như trong vezikon và vấn đề của tôi), bạn có thể tạo một phong tục Gson với thoát khuyết tật sử dụng:

Gson gson = new GsonBuilder().disableHtmlEscaping().create(); 

Vượt qua chuyển đổi này để chuyển đổi phần còn lại của bạn:

yourRestAdapter = new RestAdapter.Builder() 
    .setEndpoint(.....) 
    .setClient(.....) 
    .setConverter(new GsonConverter(gson)) 
    .build(); 

bằng cách này, "=" nhân vật trong bài viết cơ thể không bị ảnh hưởng trong khi gửi.

+0

inretrofit 2, chúng ta có thể Không sử dụng nó như thế này – Choletski

+2

Vâng, câu trả lời này là từ Retrofit 1 ngày, nhưng bạn không thể sử dụng nó theo cách tương tự trong Retrofit 2 như thế này? (Tôi chưa thử nghiệm nó): Gson gson = new GsonBuilder(). DisableHtmlEscaping(). Create(); Trang bị thêm retrofit = new Retrofit.Builder(). BaseUrl (BASE_URL) .addConverterFactory (GsonConverterFactory.create (gson)) .khách hàng (okHttpClient) .build(); –

+0

RestAdapter là gì? @ MuratÖgat –

1

Sự cố này có thể được khắc phục bằng cách giải quyết dưới đây.

@POST("yourString") 
Call<YourResponseModel> yourCallMethod(@Query("yourKey") String yourValue, 
              @Query("yourKey") String yourValue, 
              @Query("yourKey") String yourValue); 

Lưu ý: Không sử dụng "@FormUrlEncoded" cho trường hợp này.

Reference Here - https://github.com/square/retrofit/issues/1407

0

Đối Retrofit 2 bạn có thể khởi tạo trang bị thêm với một nhà máy chuyển đổi Gson.

val builder = GsonBuilder().disableHtmlEscaping().create() 
val retrofit = Retrofit.Builder() 
     .baseUrl(baseUrl) 
     .addConverterFactory(ScalarsConverterFactory.create()) 
     .addConverterFactory(GsonConverterFactory.create(builder)) 
     .client(monoOkHttpClient()) 
     .build() 

Công cụ xây dựng này nên loại bỏ thoát khỏi đầu ra json của bạn.

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