0

我正在使用 Jersey (v 1.17.1) 客户端与不受我控制的远程服务器通信(因此我看不到传入的请求)。

我喜欢使用 JSON 数据发出 POST 请求,其结构类似于此示例:

{"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);

我尝试了几种方法(比如嵌套另一个 Form 对象),但我总是得到相同的结果:服务器返回 400 - 错误请求(“客户端发送的请求在语法上不正确(错误请求)。”)我认为是因为强制参数项未正确发送。

有人知道我如何像描述的那样嵌套 JSON 数据吗?我认为这是一种常见的情况,但我在网上没有找到任何例子。

4

1 回答 1

0

表单本质上是一个将您的值限制为字符串的映射。您需要的是一个简单的 Map(例如 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));

这样,您可以根据需要进行尽可能多的嵌套。

或者,您可以创建一些代表您的数据结构的类。Jersey 会知道如何序列化它。

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

class Data {
  String customer;
  String date;
  List<Item> items;
  // getters & setters
}
于 2013-10-28T11:16:26.033 回答