Модификация - отправка тела запроса в виде массива или номера - PullRequest
0 голосов
/ 31 октября 2018

Я использую Retrofit 2 и мне нужно отправить тело запроса. Проблема в том, как-то значение преобразуется в строку. В приведенном ниже примере вы можете видеть, что items и totalPrice, которые должны быть соответственно массивом и числом, конвертируются в строку.

{ cashierId: 'fff7079c-3fc2-453e-99eb-287521feee63',
  items: '[{"amount":3,"id":"602a79e3-b4c1-4161-a082-92202f92d1d6","name":"Play Station Portable","price":1500000.0}]',
  paymentMethod: 'Debt',
  totalPrice: '4500000.0' }

Желаемое тело запроса:

{ cashierId: 'fff7079c-3fc2-453e-99eb-287521feee63',
  items: [{"amount":3,"id":"602a79e3-b4c1-4161-a082-92202f92d1d6","name":"Play Station Portable","price":1500000.0}],
  paymentMethod: 'Debt',
  totalPrice: 4500000.0 }

Вот услуга

@POST("api/sales")
@FormUrlEncoded
Call<Sale> createSale(
    @FieldMap Map<String, Object> fields
);

А вот как я называю createSale

Map<String, Object> fields = new HashMap<>();
fields.put("cashierId", UUID.fromString("fff7079c-3fc2-453e-99eb-287521feeaaa"));
fields.put("totalPrice", totalPrice);
fields.put("paymentMethod", paymentMethod);
fields.put("items", jsonArray);

Call<Sale> call = retailService.createSale(fields);

Можно ли отправить эти значения в виде числа и массива, а не в виде строки?

1 Ответ

0 голосов
/ 01 ноября 2018

Преобразование, скорее всего, происходит, потому что вы используете @FormUrlEncoded. Согласно документации :

Имена и значения полей будут кодироваться в UTF-8, а затем кодироваться в URI в соответствии с RFC-3986.

Решением было бы использование класса модели вместо Map. Я вижу, у вас уже есть класс продажи. Если это выглядит примерно так:

public class Sale {
    String cashierId;
    int totalPrice;
    String paymentMethod;
    ArrayList<SomeObject> items;
}

Вы можете просто сделать так:

// in service
@POST("api/sales")
Call<Sale> createSale(@Body Sale sale);

// when doing the call
Sale sale = new Sale();
// set everything in your object
// then
Call<Sale> call = retailService.createSale(sale);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...