2016-04-28 27 views
9

Sử dụng Retrofit 2.0.1, có một chức năng gọi trong giao diện API của tôi được xác định trong Android App:Retrofit 2 Multipart POST yêu cầu gửi báo giá thêm để PHP

@Multipart 
@POST("api.php") 
Call<ResponseBody> doAPI(
    @Part("lang") String lang, 
    @Part("file\"; filename=\"image.jpg") RequestBody file 
); 

Tôi gửi yêu cầu như thế này:

Cuộc gọi gọi = service.doAPI ("eng", imageFile);

trong đó imageFileRequestBody được tạo với đối tượng File. Phần hình ảnh tải lên không có vấn đề, trong khi phần @Part("lang") String lang có thêm dấu ngoặc kép trong máy chủ.

Trong bên PHP, nó được viết như sau:

$lang = trim($_POST['lang']); 

trả về "eng". Tại sao có thêm một dấu nháy kép bao quanh chuỗi?

dĩ nhiên tôi có thể tước dấu và dấu ngoặc kép hàng đầu, nhưng đó là lạ để làm như vậy


Issue liên quan: https://github.com/square/retrofit/issues/1210

+0

Nếu dự án của bạn sử dụng Retrofit 2, IMO, bạn có thể xem câu trả lời của tôi tại http://stackoverflow.com/question/36491096/retrofit-multipart-request-required-multipartfile-parameter-file-là-không-trước/36514662 # 36514662, hãy chú ý đến 'Call postFile (@Part MultipartBody.Part file, @Part ("descr iption ") Mô tả RequestBody);' – BNK

+0

Có, sử dụng Retrofit 2. Có cần sử dụng 'MultipartBody.Part' không? như 'RequestBody' cũng đang hoạt động để tải lên tệp. Sự khác biệt là gì? – Raptor

+0

Ah, tôi không có nghĩa là phần hình ảnh, chỉ có nghĩa là '@Part (" description ") Mô tả RequestBody' thay vì' @Part ("lang") Chuỗi lang', bởi vì phần này là vấn đề của bạn :) – BNK

Trả lời

12

Đối với vấn đề của bạn, hãy sử dụng như tài liệu

Scalars (nguyên thủy, đóng hộp và chuỗi): com.squareup.retrofit2: converter-scalars

Vì vậy, thêm vào compile 'com.squareup.retrofit2:converter-scalars:2.0.1'build.gradle tập tin

Sau đó ...

Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl(API_URL_BASE) 
    .addConverterFactory(ScalarsConverterFactory.create()) 
    //.addConverterFactory(GsonConverterFactory.create()) 
    .build(); 

Hy vọng nó sẽ giúp!

+0

là nhà máy chuyển đổi mới này hỗ trợ các yêu cầu liên quan đến gson hoặc FormUrlEncoded trước đó hoặc chúng ta cần phải chuyển đổi tất cả yêu cầu của chúng tôi sang loại Mutipart. hiểu ý tôi là gì – Killer

+0

java.lang.IllegalArgumentException: Không thể tạo trình chuyển đổi cho lớp – Yazon2006

+0

@ Yazon2006 http://stackoverflow.com/questions/32343183/retrofit-could-not-locate-converter-for-class-crashing-app – BNK

2

Sử dụng RequestBody cho tất cả các thông số của bạn. Xin vui lòng đi qua mã dưới đây !!

File file = new File(imagePath); 
RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); 
MultipartBody.Part imageFileBody = MultipartBody.Part.createFormData("media", file.getName(), requestBody); 
RequestBody id = RequestBody.create(MediaType.parse("text/plain"),addOfferRequest.getCar_id()); 
ApiCallback.MyCall<BaseResponse> myCall = apiRequest.editOfferImage(imageFileBody,id); 

Sử dụng RequestBody lớp Retrofit thay vì chuỗi

@Multipart 
@POST(ApiURL) 
ApiCallback.MyCall<BaseResponse> editOfferImage(@Part MultipartBody.Part imageFile,@Part("id") RequestBody id); 
Các vấn đề liên quan