J'essaie d'envoyer plusieurs photos au serveur avec Retrofit. J'ai un point de terminaison comme celui-ci:
int price; String currency; ArrayList<String> tags;
Mais je ne sais pas comment ajouter à cette méthode POST des informations supplémentaires avec:
@Multipart @POST("/v1/props") Call<ModelProp> createProp( @Header("x-auth") String token, @Part List<MultipartBody.Part> photo );
Peut quelqu'un m'aide-t-il à ajouter ces champs à POST avec retrofit?
modifier: Le tableau peut contenir plus de 1000 éléments
3 Réponses :
Dans Retrofit 2, vous pouvez lui envoyer des données supplémentaires avec l'image de la manière suivante:
Modifier: En fonction de la réponse d'Ali Ghafari, vous pouvez également utiliser PartMap
public RequestBody createPartFromString(String string) { return RequestBody.create(MultipartBody.FORM, string); }
Vous pouvez l'utiliser comme ceci:
private MultipartBody.Part prepareFilePart(String partName, Uri fileUri){ File file = new File(fileUri.getPath();); RequestBody requestBody = RequestBody.create(MediaType.parse(getContentResolver().getType(fileUri)), file); return MultipartBody.Part.createFormData(partName, file.getName(),requestBody); }
prepareFilePart
méthode
List<MultipartBody.Part> parts = new ArrayList<>(); for (int i=0; i < upFileList.size(); i++){ parts.add(prepareFilePart("my_file["+i+"]", upFileList.get(i))); } Map<String, RequestBody> partMap = new HashMap<>(); partMap.put("price", createPartFromString(edtPrice.getText().toString())); partMap.put("currency", createPartFromString(edtCurrency.getText().toString())); partMap.put("tags", createPartFromString(new Gson().toJson(tagsArrayList)); Call<User> call = client.createProp(TokenUtils.getToken(this), partMap); call.enqueue(new Callback<ModelProp>() { @Override public void onResponse(retrofit.Response<ModelProp> response, Retrofit retrofit) { // consume response } @Override public void onFailure(Throwable t) { t.printStackTrace(); } });
Méthode createPartFromString
public interface ApiInterface { @Multipart @POST("/v1/props") Call<ModelProp> createProp(@Header("x-auth") String token, @Part List<MultipartBody.Part> photo, @PartMap Map<String, RequestBody> map }
Cela semble vrai, le vérifiera avec le code et marquera la réponse. Merci!
d'où puis-je obtenir la méthode getPath () dans un nouveau fichier (getPath (fileUri))?
fileUri.getPath ()
- donne une erreur onFailure: / external / images / media / 63927 (aucun fichier ou répertoire de ce type)
changez votre interface en ceci:
public RequestBody createPartFromString(String string) { return RequestBody.create(MultipartBody.FORM, string); }
et utilisez ces codes pour obtenir des cartes et les envoyer à createProp
:
public Map<String, RequestBody> getMap() { Map<String, RequestBody> partMap = new HashMap<>(); String authorS = author.getText().toString(); partMap.put("price", createPartFromString(price)); // you can put more filed to partMap return partMap; }
Comment ajouter un tableau à cela?
Option1: Utilisez plusieurs @Part
et transmettez vos arguments normalement.
RequestBody price = ... RequestBody currency = ... RequestBody tags = ... HashMap<String, RequestBody> map = new HashMap<>(); map.put("price", description); map.put("currency", place); map.put("tags", time);
Option2: Utilisez @PartMap
et faites une carte
inclure vos données.
@Multipart @POST("/v1/props") Call<ModelProp> createProp( @Header("x-auth") String token, @Part List<MultipartBody.Part> photo, @PartMap Map<String, RequestBody> dataMap );
et créez une carte de données à transmettre p>
@Multipart @POST("/v1/props") Call<ModelProp> createProp( @Header("x-auth") String token, @Part List<MultipartBody.Part> photo, @Part("price") int price, @Part("currency") String currency, @Part("tags") List<String> tags );
vous pouvez ajouter des informations supplémentaires à la chaîne de requête
Comment puis-je ajouter un tableau à la chaîne de requête? Y a-t-il un moyen?
lorsque vous créez une URL, vous pouvez y ajouter le paramètre de requête. Depuis le serveur, vous devrez traiter ces paramètres.
HttpUrl url = originalHttpUrl.newBuilder () .addQueryParameter ("param1", "param1_value") .build ();
s'il vous plaît se référer à [ futurestud.io / tutoriels /…
Merci pour vos conseils, mais si j'ai 1000 éléments dans le tableau, ce n'est pas une bonne idée de l'ajouter à une chaîne de requête