2016-04-28 37 views
9

Korzystanie Retrofit 2.0.1, nie jest funkcją wywołania interfejsu API w moim zdefiniowane w Android App:prośba Modernizacja 2 Multipart POST wysyła dodatkowe cytaty PHP

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

wyślę prośbę tak:

Wywołanie połączenia = service.doAPI ("eng", imageFile);

gdzie imageFile jest RequestBody utworzone za pomocą obiektu File. Część obrazu do przesyłania nie stanowi problemu, a część @Part("lang") String lang ma dodatkowe cytaty na serwerze.

Na stronie PHP jest napisane następująco:

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

która zwraca "eng". Dlaczego istnieje dodatkowy podwójny cudzysłów otaczający ciąg?

oczywiście mogę rozebrać tylną i przednią cudzysłów, ale to dziwne, aby to zrobić


Powiązane Problem: https://github.com/square/retrofit/issues/1210

+0

Jeśli projekt korzysta Retrofit 2, IMO można zobaczyć moją odpowiedź na http://stackoverflow.com/questions/36491096/retrofit-multipart-request-required-multipartfile-parameter-file-is-not-pre/36514662 # 36514662, pls zwróć uwagę na 'Call postFile (@Part MultipartBody.Part file, @Part ("descr iption ") Opis RequestBody);' – BNK

+0

Tak, używając Retrofit 2. Czy wymagane jest użycie 'MultipartBody.Part'? jako 'RequestBody' działa również do przesyłania plików. Jaka jest różnica? – Raptor

+0

Ah, nie mam na myśli części obrazu, po prostu oznacz "@Part (" description ") RequestBody description' zamiast' @Part ("lang") String lang', ponieważ ta część jest twoim problemem :) – BNK

Odpowiedz

12

Dla Twojego problemu, proszę używać jako dokumentacji

Skalary (prymitywy, zapakowane i łańcuch): com.squareup.retrofit2: konwerter-skalary

Więc dodać compile 'com.squareup.retrofit2:converter-scalars:2.0.1' do build.gradle pliku

Potem ...

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

Nadzieję, że to pomaga!

+0

czy ta nowa fabryka konwerterów obsługuje inne poprzednie żądania związane z Gsonem lub FormUrlEncoded, czy też musimy przekonwertować wszystkie nasze żądania na typ Mutipart. mam co mam na myśli – Killer

+0

java.lang.IllegalArgumentException: Nie można utworzyć konwertera dla klasy – Yazon2006

+0

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

2

Użyj RequestBody dla wszystkich swoich parametrów. Proszę przejść poniżej kodu !!

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); 

Zastosowanie RequestBody klasa Retrofit zamiast String

@Multipart 
@POST(ApiURL) 
ApiCallback.MyCall<BaseResponse> editOfferImage(@Part MultipartBody.Part imageFile,@Part("id") RequestBody id);