改造-以数组或数字形式发送请求正文

时间:2018-10-31 16:36:20

标签: android retrofit2

我正在使用Retrofit 2,我需要发送请求正文。问题在于将值转换为字符串。在下面的示例中,您可以看到应该分别为数组和数字的itemstotalPrice转换为字符串。

{ 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 :(得分:1)

由于您使用的是@FormUrlEncoded,因此转换肯定会发生。 根据{{​​3}}:

  

字段名称和值在按照RFC-3986进行URI编码之前将先经过UTF-8编码。

一种解决方案是使用模型类而不是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);