Клиент из Джерси: как отправить вложенные данные JSON?

Я использую клиент Jersey (v 1.17.1) для связи с удаленным сервером, который не находится под моим контролем (поэтому я не вижу входящие запросы).

Мне нравится отправлять запрос POST с данными JSON, который имеет структуру, аналогичную этому примеру:

{"customer":"Someone",
 "date":"2013-09-12",
 "items":[{
     "sequenceNo":1,
     "name":"foo",
     "quantity":2,
     "price":42,
     "tax":{"percent":7,"name":"vat 7%"}
   },
   {
     "sequenceNo":2,
     "name":"bar",
     "quantity":5,
     "price":23,
    "tax":{"percent":7,"name":"vat 7%"}
   }
 ]
}

Это мой код:

final Client c = Client.create();
final WebResource service = c.resource(SERVER);

final Form form = new Form();
form.add("customer", "Someone");
form.add("date", "2013-09-12");
form.add("items", XXX); // how do I do that?

final ClientResponse response = service.path("aPath").queryParam("param", "value").cookie(new Cookie("token", token))
        .type(MediaType.APPLICATION_JSON)
        .post(ClientResponse.class, form);
    final String raw = response.getEntity(String.class);
    System.out.println("Response " + raw);

Я пробовал несколько подходов (например, вложение другого объекта формы), но всегда получаю один и тот же результат: сервер возвращает 400 — Bad Request («Запрос, отправленный клиентом, был синтаксически неправильным (Bad Request)»). Я предполагаю, что обязательный элементы параметров не отправляются правильно.

Кто-нибудь знает, как я вставляю данные JSON, как описано? Я думаю, что это распространенный случай, но я не нашел примеров в Интернете.


person Steffzilla    schedule 12.09.2013    source источник
comment
Я все еще ищу решение, но этот ответ полезен: Это позволяет вести журнал на стороне клиента   -  person Steffzilla    schedule 13.09.2013


Ответы (1)


Форма — это, по сути, карта, которая ограничивает ваши значения строками. Вам нужна простая карта (например, HashMap). Каждый вложенный элемент также будет картой. Так что у вас будет что-то вроде этого.

Map<String, Object> data = new HashMap<String, Object>();
data.put("customer", "Someone");
data.put("date", "2013-09-12");

Map<String, Object> item1 = new HashMap<String, Object>();
item1.put("sequenceNo", 2);
item1.put("name", "foo");

data.put("items", Arrays.asList(item1));

Таким образом, вы можете сделать столько вложений, сколько вам нужно.

В качестве альтернативы вы можете создать несколько классов, которые представляют ваши структуры данных. Джерси будет знать, как его сериализовать.

class Item {
  String name;
  int sequenceNo;
  // getters & setters
}

class Data {
  String customer;
  String date;
  List<Item> items;
  // getters & setters
}
person kkamenev    schedule 28.10.2013