@morotkin

Retrofit 2, POST запрос(multipart/form-data) как передать параметры?

Здравствуйте!
Пытаюсь отправить на сервер POST запрос на создание заказа. Использую Retrofit 2.
Описываю переменные:
private Gson gson = new GsonBuilder().create();
    private Retrofit retrofit = new Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create(gson))
            .baseUrl("mySite.ru")
            .build();
    private APIv1 intface = retrofit.create(APIv1.class);

Подскажите как правильно передать параметры на сервер?
Формирую следующий Map, а как правильно описать Интерфейс и передать параметр не могу сообразить:
Map<String, String> params = new HashMap<String, String>();

        params.put("price", String.valueOf(OrderProducts.getBoxSumm()));
        params.put("number_person", "1");
        params.put("payment_type", "cash");
        params.put("delivery", "yes");
        params.put("client[name]", this.clientname);
        params.put("client[phone]", this.clientphone);
        params.put("client[address]", this.clientaddress);

        List<OrderProducts> orderProducts = OrderProducts.getOrderProductsNew();
        for (int i = 0; i < orderProducts.size(); i++) {
            OrderProducts p = orderProducts.get(i);

            Product product = Product.getProductById(p.productid);
            if (product != null) {

                params.put("products["+ String.valueOf(i)+"][product_id]", String.valueOf(product.extid));
                params.put("products["+ String.valueOf(i)+"][amount]", String.valueOf(p.amount));
            }
        }


Интерфейс
public interface APIv1 {

    @Multipart
    @POST("/api/v1/order/create")
    Response SendOrder(@Body ЧтоДолжноБытьЗдесь?);

}

Заранее спасибо!
  • Вопрос задан
  • 7032 просмотра
Решения вопроса 1
@morotkin Автор вопроса
В общем сделал так и заработало:

интерфейс
public interface APIv1 {

    @Multipart
    @POST("/api/v1/order/create")
    Call<ResponseBody> SendOrder(@PartMap Map<String, RequestBody> params);

}


упаковка параметров:
RequestBody rb;
        LinkedHashMap<String, RequestBody> mp= new LinkedHashMap<>();

        rb = RequestBody.create(MediaType.parse("text/plain"), String.valueOf((int)OrderProducts.getBoxSumm()));
        mp.put("price", rb);

        rb = RequestBody.create(MediaType.parse("text/plain"), "1");
        mp.put("number_person", rb);

        rb = RequestBody.create(MediaType.parse("text/plain"), "cash");
        mp.put("payment_type", rb);

        rb = RequestBody.create(MediaType.parse("text/plain"), "yes");
        mp.put("delivery", rb);

        rb = RequestBody.create(MediaType.parse("text/plain"), this.clientname);
        mp.put("client[name]", rb);

        rb = RequestBody.create(MediaType.parse("text/plain"), this.clientphone);
        mp.put("client[phone]", rb);

        rb = RequestBody.create(MediaType.parse("text/plain"), this.clientaddress);
        mp.put("client[address]", rb);

        List<OrderProducts> orderProducts = OrderProducts.getOrderProductsNew();
        for (int i = 0; i < orderProducts.size(); i++) {
            OrderProducts p = orderProducts.get(i);

            Product product = Product.getProductById(p.productid);
            if (product != null) {

                rb = RequestBody.create(MediaType.parse("text/plain"), String.valueOf(product.extid));
                mp.put("products["+ String.valueOf(i)+"][product_id]", rb);

                rb = RequestBody.create(MediaType.parse("text/plain"), String.valueOf(p.amount));
                mp.put("products["+ String.valueOf(i)+"][amount]", rb);

            }
        }


выполнение запроса:
Call<ResponseBody> call = intface.SendOrder(mp);

        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
                Log.v("Upload", "success");
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                Log.e("Upload error:", t.getMessage());
            }
        });
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@TiPo
А почему не
@FormUrlEncoded
@POST("/api/v1/order/create")
Call<Void> sendOrder(@FieldMap Map<String, String> params);


Пример с @Multipart : https://futurestud.io/tutorials/retrofit-2-how-to-...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы