2016-04-05 16 views
9

Sto provando a inviare un'immagine a un server. Il mio URL contiene alcuni parametri sul mio cellulare:% 3F anziché il punto interrogativo nel mio URL di retrofit

api/v2/user/email_register%3F_height=1184&_target=android/2&_width=768 

e questa è la variante di lavoro:

api/v2/user/email_register?_height=1184&_target=android/2&_width=768 

(? Senza irritazione% 3 codice)

Inoltre, sto cercando di passare la mia foto all'interno @Body:

@POST("/{url}") 
Observable<UpdateUserInfoPayload> register(
     @Header("x-device-id") String deviceId, 
     @Body RequestBody requestBody, 
     @Path(value = "url", encoded = true) String method 
); 

Creazione con MultipartBuilder:

01.235.164,106 mila
protected RequestBody buildAvatar(String avatarPath) { 


MultipartBuilder builder = new MultipartBuilder() 
    .type(MultipartBuilder.FORM) 
    .addFormDataPart(ParkApiUrl.PARAM_USER_NAME, name.getText().toString()) 
    .addFormDataPart(ParkApiUrl.PARAM_USER_SECOND_NAME, lastName.getText().toString()) 
    .addFormDataPart(ParkApiUrl.PARAM_EMAIL, email.getText().toString()) 
    .addFormDataPart(ParkApiUrl.PARAM_USER_ENCODED_PASSWORD, 
    PasswordUtils.encodePassword(encodePassword())) 
    .addFormDataPart(ParkApiUrl.PARAM_USER_GENDER, 
    male.isChecked() ? EmailProfile.GENDER_MALE : EmailProfile.GENDER_FEMALE) 
    .addFormDataPart(ParkApiUrl.PARAM_PARSE_ID, 
    ParseInstallation.getCurrentInstallation().getObjectId()); 


File file = new File(avatarPath);; 
int size = (int) file.length(); 
byte[] bytes = new byte[size]; 
try { 
    BufferedInputStream buf = new BufferedInputStream(new FileInputStream(file)); 
    buf.read(bytes, 0, bytes.length); 
    buf.close(); 
    builder.addFormDataPart("photo", "image.jpg", RequestBody.create(MEDIA_TYPE_JPG, bytes)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
return builder.build(); 
} 

Questo è il motivo per cui sono in grado di utilizzare, ad esempio:

@FieldMap Map<String, String> params 

di passare i miei parametri lì, perché @FieldMap richiede @FormUrlEncoded, mentre io sono in grado di fare richiesta @Body con @FormUrlEncoded .

1) Come rimuovere% 3F dalla mia stringa URL? (al di fuori del retrofit è tutto a posto!)

2) C'è un modo semplice per inviare un'immagine?

UPD: <-403 Forbidden https://api.example.com/api/v2/user/5984/validate_password quando uso annotazione @Field:

@FormUrlEncoded 
@POST("/{url}") 
Observable<BooleanResponse> validatePassword(
     @Header("x-device-id") String deviceId, 
     @Field(ParkApiUrl.PARAM_USER_ENCODED_PASSWORD) String password, 
     @Field(ParkApiUrl.PARAM_HEIGHT) String height, 
     @Field(ParkApiUrl.PARAM_WIDTH) String width, 
     @Field(ParkApiUrl.PARAM_TARGET) String target, 

     @Path(value = "url", encoded = true) String method 
); 

Tutto funziona quando lo uso così:

voglio sia per rimuovere% 3F o imparare come utilizzare Field nella richiesta POST senza ottenere FORBIDDEN

risposta

2

Retrofit non consente di inserire la stringa di query nel percorso. Date un'occhiata a @QueryMap invece, che è stato progettato per questo.

+2

ho ancora vuoi sbarazzarti di questo% 3F e mettere un punto interrogativo. Qualche idea? –

+0

È anche possibile visualizzare questo https://square.github.io/retrofit/2.x/retrofit/index.html?retrofit2/http/QueryMap.html – Mehdi

0

L'idea migliore è, fare una richiesta a più parte per l'invio di immagini

@Multipart 
@POST("api/v2/user/email_register") 
Observable<UpdateUserInfoPayload> register(@Part("_height") String height, @Part("_target") String target, @Part("_width") String width, @Part("imageFile") TypedFile file); 

ref: https://futurestud.io/blog/retrofit-how-to-upload-files#introduction

Non c'è bisogno di aggiungere/rimuovere% 3F in retrofit che gestirà automaticamente

+0

Utilizzare un RequestBody dalla versione 2. + – jobbert