- MOXy как ваш JAX-RS JSON-провайдер — на стороне сервера
- MOXy как ваш JAX-RS JSON-провайдер — на стороне клиента
URI
Этот пост будет посвящен следующему URI от сервиса, который мы объявили в предыдущем посте . Следующий звонок вернет список клиентов, которые живут в «Любой город».
|
1
|
http://localhost:8080/CustomerService/rest/customers/findCustomersByCity/Any%20Town |
Клиентские API Java SE
В первом примере мы будем использовать стандартные API Java SE 6. Некоторые интересные вещи, чтобы отметить:
- MOXy может напрямую маршалировать (строка 35) и демаршалировать (строка 28) коллекции в / из массивов JSON без использования объекта-оболочки.
- На MOXy нет зависимостей времени компиляции (это зависимость времени выполнения).
- Свойство eclipselink.media-type используется для включения привязки JSON для демаршаллера (строка 25) и маршаллера (строка 33).
- Свойство eclipselink.json.include-root используется для указания того, что аннотация @XmlRootElement должна игнорироваться в привязке JSON (строки 26 и 34).
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
package example;import java.io.InputStream;import java.net.*;import java.util.List;import javax.xml.bind.*;import javax.xml.transform.stream.StreamSource;import org.example.Customer;public class JavaSEClient { private static final String MEDIA_TYPE = "application/json"; public static void main(String[] args) throws Exception { URL url = new URL(uri); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", MEDIA_TYPE); JAXBContext jc = JAXBContext.newInstance(Customer.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); unmarshaller.setProperty("eclipselink.media-type", MEDIA_TYPE); unmarshaller.setProperty("eclipselink.json.include-root", false); InputStream xml = connection.getInputStream(); List<Customer> customers = (List<Customer>) unmarshaller.unmarshal(new StreamSource(xml), Customer.class).getValue(); connection.disconnect(); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setProperty("eclipselink.media-type", MEDIA_TYPE); marshaller.setProperty("eclipselink.json.include-root", false); marshaller.marshal(customers, System.out); }} |
Выход
Ниже приведены результаты работы клиента Java SE. Для тех, кто мог использовать реализацию JAXB ( JSR-222 ) с чем-то вроде Jettison для производства / потребления JSON, вот некоторые интересные пункты, на которые следует обратить внимание:
- MOXy отображает коллекции в виде массивов JSON.
- MOXy правильно представляет числовые значения без кавычек (строка 26).
- MOXy правильно окружает коллекции размера 1 квадратными скобками (строки 28 и 32).
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
[ { "address" : { "city" : "Any Town", "id" : 1, "street" : "1 A Street" }, "firstName" : "Jane", "id" : 1, "lastName" : "Doe", "phoneNumbers" : [ { "id" : 2, "num" : "555-2222", "type" : "HOME" }, { "id" : 1, "num" : "555-1111", "type" : "WORK" } ]}, { "address" : { "city" : "Any Town", "id" : 10, "street" : "456 Another Road" }, "firstName" : "Sue", "id" : 10, "lastName" : "Jones", "phoneNumbers" : [ { "id" : 10, "num" : "555-3333", "type" : "WORK" } ]} ] |
Клиентские API Джерси
JAX-RS 2.0 ( JSR-339 ) работает над стандартизацией клиентских API. С JAX-RS 1.0 многие реализации предоставляют свою собственную версию. Ниже приведен пример использования клиентских API, предоставленных Jersey . Обратите внимание, как мы можем использовать точно такой же MessageBodyReader / Writer, который мы использовали на стороне сервера (строка 14, обозначьте MOXy как Ваш JSON-поставщик JAX-RS — Сторона сервера ). Я также указал LoggingFilter (строка 17), чтобы мы могли более внимательно посмотреть на сообщение.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
package example;import java.util.List;import org.example.Customer;import org.example.MOXyJSONProvider;import com.sun.jersey.api.client.*;import com.sun.jersey.api.client.config.*;import com.sun.jersey.api.client.filter.LoggingFilter;public class JerseyClient { public static void main(String[] args) { ClientConfig cc = new DefaultClientConfig(); cc.getClasses().add(MOXyJSONProvider.class); Client client = Client.create(cc); client.addFilter(new LoggingFilter()); List<Customer> customers = resource.path("/findCustomersByCity/Any%20Town").accept("application/json").get(new GenericType<List<Customer>>(){}); for(Customer customer : customers) { System.out.println(customer.getFirstName()); } }} |
Выход
Ниже приведен результат запуска клиента Джерси.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
14-Mar-2012 4:08:12 PM com.sun.jersey.api.client.filter.LoggingFilter logINFO: 1 * Client out-bound request1 > GET http://localhost:8080/CustomerService/rest/customers/findCustomersByCity/Any%20Town1 > Accept: application/json1 > 14-Mar-2012 4:08:12 PM com.sun.jersey.api.client.filter.LoggingFilter logINFO: 1 * Client in-bound response1 < 2001 < Transfer-Encoding: chunked1 < Date: Wed, 14 Mar 2012 20:08:12 GMT1 < Content-Type: application/json1 < X-Powered-By: Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.1 Java/Oracle Corporation/1.7)1 < Server: GlassFish Server Open Source Edition 3.1.11 < [{"address" : {"city" : "Any Town", "id" : 1, "street" : "1 A Street"}, "firstName" : "Jane", "id" : 1, "lastName" : "Doe", "phoneNumbers" : [{"id" : 1, "num" : "555-1111", "type" : "WORK"}, {"id" : 2, "num" : "555-2222", "type" : "HOME"}]}, {"address" : {"city" : "Any Town", "id" : 10, "street" : "456 Another Road"}, "firstName" : "Sue", "id" : 10, "lastName" : "Jones", "phoneNumbers" : [{"id" : 10, "num" : "555-3333", "type" : "WORK"}]}]Doe, JaneJones, Sue |
Дальнейшее чтение
Если вам понравился этот пост, то вы также можете быть заинтересованы в:
- RESTful Услуги
- MOXy как ваш JAX-RS JSON-провайдер — на стороне сервера
- Создание сервиса RESTful
- JSON Binding
Ссылка: MOXy как ваш JAX-RS JSON-провайдер — Клиентская сторона от нашего партнера JCG Блеза Дафана в блоге Java XML & JSON Binding