日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Http Message Converters with the Spring Framework--转载

發(fā)布時間:2025/4/5 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Http Message Converters with the Spring Framework--转载 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文:http://www.baeldung.com/spring-httpmessageconverter-rest

1. Overview

This article describes?how to Configure?HttpMessageConverter?in Spring.

Simply put, message converters are used to marshall and unmarshall Java Objects to and from JSON, XML, etc – over HTTP.

2. The Basics

2.1. Enable Web MVC

The Web Application needs to be?configured with Spring MVC support?– one convenient and very customizable way to do this is to use the?@EnableWebMvc?annotation:

?
1 2 3 4 5 6 @EnableWebMvc @Configuration @ComponentScan({ "org.baeldung.web" }) public class WebConfig extends WebMvcConfigurerAdapter { ????... }

Note that this class extends?WebMvcConfigurerAdapter?– which will allow us to change the default list of Http Converters with our own.

2.2. The Default Message Converters

By default, the following?HttpMessageConverters instances are pre-enabled:

  • ByteArrayHttpMessageConverter?– converts byte arrays
  • StringHttpMessageConverter?– converts Strings
  • ResourceHttpMessageConverter?– converts?org.springframework.core.io.Resource?for any type of octet stream
  • SourceHttpMessageConverter?– converts?javax.xml.transform.Source
  • FormHttpMessageConverter?– converts form data to/from a?MultiValueMap<String, String>.
  • Jaxb2RootElementHttpMessageConverter?– converts Java objects to/from XML (added only if JAXB2 is present on the classpath)
  • MappingJackson2HttpMessageConverter?– converts JSON (added only if Jackson 2 is present on the classpath)
  • MappingJacksonHttpMessageConverter?– converts JSON (added only if Jackson is present on the classpath)
  • AtomFeedHttpMessageConverter?– converts Atom feeds (added only if Rome is present on the classpath)
  • RssChannelHttpMessageConverter?– converts RSS feeds?(added only if Rome is present on the classpath)

3. Client-Server Communication – JSON only

3.1. High Level Content Negotiation

Each?HttpMessageConverter?implementation has one or several associated MIME Types.

When receiving a new request, Spring will?use of the “Accept” header to determine the media type?that it needs to respond with.

It will then try to find a registered converter that is capable of handling that specific media type – and it will use it to?convert the entity?and send back the response.

The process is similar for receiving a request which contains JSON information – the framework will?use? the “Content-Type” header to determine the media type?of the request body.

It will then search for a?HttpMessageConverter?that can?convert the body?sent by the client to a Java Object.

Let’s clarify this with?a quick example:

  • the Client sends a GET request to?/foos?with the?Accept?header set to?application/json?– to get all?Foo?resources as Json
  • the?Foo?Spring Controller is hit and returns the corresponding?Foo?Java entities
  • Spring then uses one of the Jackson message converters to marshall the entities to json

Let’s now look at the specifics of how this works – and how we should leverage the@ResponseBody?and?@RequestBody?annotations.

3.2.?@ResponseBody

@ResponseBody?on a Controller method indicates to Spring that?the return value of the method is serialized directly to the body of the HTTP Response. As discussed above, the “Accept” header specified by the Client will be used to choose the appropriate Http Converter to marshall the entity.

Let’s look at a simple example:

?
1 2 3 4 @RequestMapping(method=RequestMethod.GET, value="/foos/{id}") public @ResponseBody Foo findById(@PathVariable long id) { ????return fooService.get(id); }

Now, the client will specify the “Accept” header to?application/json?in the request – example?curl?command:

?
curl --header "Accept: application/json" http://localhost:8080/spring-rest/foos/1

The?Foo?class:

?
1 2 3 4 public class Foo { ????private long id; ????private String name; }

And the Http Response Body:

?
1 2 3 4 { ????"id": 1, ????"name": "Paul", }

3.3.?@RequestBody

@RequestBodyis used on the argument of a Controller method – it indicates to Spring?that the body of the HTTP Request is deserialized to that particular Java entity. As discussed previously, the “Content-Type” header specified by the Client will be used to determine the appropriate converter for this.

Let’s look at?an example:

?
1 2 3 4 @RequestMapping(method=RequestMethod.PUT, value="/foos/{id}") public @ResponseBody void updateFoo(@RequestBody Foo foo, @PathVariable String id) { ????fooService.update(foo); }

Now, let’s consume this with a JSON object – we’re specifying “Content-Type”?to beapplication/json:

?
curl -i -X PUT -H "Content-Type: application/json"? -d '{"id":"83","name":"klik"}' http://localhost:8080/spring-rest/foos/1

We get back a 200 OK – a successful response:

?
1 2 3 4 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Length: 0 Date: Fri, 10 Jan 2014 11:18:54 GMT

4. Custom Converters Configuration – adding XML Support

We can?customize the message converters by extending the?WebMvcConfigurerAdapter class?and overriding the?configureMessageConvertersmethod:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 @EnableWebMvc @Configuration @ComponentScan({ "org.baeldung.web" }) public class WebConfig extends WebMvcConfigurerAdapter { ????@Override ????public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { ????????messageConverters.add(createXmlHttpMessageConverter()); ????????messageConverters.add(new MappingJackson2HttpMessageConverter()); ????????super.configureMessageConverters(converters); ????} ????private HttpMessageConverter<Object> createXmlHttpMessageConverter() { ????????MarshallingHttpMessageConverter xmlConverter = ??????????new MarshallingHttpMessageConverter(); ????????XStreamMarshaller xstreamMarshaller = new XStreamMarshaller(); ????????xmlConverter.setMarshaller(xstreamMarshaller); ????????xmlConverter.setUnmarshaller(xstreamMarshaller); ????????return xmlConverter; ????} }

Note that?the XStream library now needs to be present on the classpath.

Also be aware that by extending this support class,?we are losing the default message converters which were previously pre-registered?– we only have what we define.

Let’s go over this example – we are creating a new converter – theMarshallingHttpMessageConverter?– and we’re using the Spring XStream support to configure it. This allows a great deal of flexibility since?we’re working with the low level APIs of the underlying marshalling framework?– in this case XStream – and we can configure that however we want.

We can of course now do the same for Jackson – by defining our ownMappingJackson2HttpMessageConverter?we can now set a custom?ObjectMapper?on this converter and have it configured as we need to.

In this case XStream was the selected marshaller/unmarshaller implementation, but others like?CastorMarshaller?can be used to – refer to Spring api documentation for full list of available marshallers.

At this point – with XML enabled on the back end – we can consume the API with XML Representations:

?
1 curl --header "Accept: application/xml" http://localhost:8080/spring-rest/foos/1

5. Using Spring’s?RestTemplate?with Http Message Converters

As well as with the server side, Http Message Conversion can be configured in the client side on the Spring?RestTemplate.

We’re going to configure the template with the “Accept” and “Content-Type” headers when appropriate and we’re going to try to consume the REST API with full marshalling and unmarshalling of the?Foo?Resource – both with JSON and with XML.

5.1. Retrieving the Resource with no Accept Header

?
1 2 3 4 5 6 7 @Test public void testGetFoo() { ??????String URI = “http://localhost:8080/spring-rest/foos/{id}"; ??????RestTemplate restTemplate = new RestTemplate(); ??????Foo foo = restTemplate.getForObject(URI, Foo.class, "1"); ??????Assert.assertEquals(new Integer(1), foo.getId()); }

5.2. Retrieving a Resource with?application/xml?Accept header

Let’s now explicitly retrieve the Resource as an XML Representation – we’re going to define a set of Converters – same way we did previously – and we’re going to set these on the RestTemplate.

Because we’re consuming XML, we’re going to use the same XStream marshaller as before:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 @Test public void givenConsumingXml_whenReadingTheFoo_thenCorrect() { ????String URI = BASE_URI + "foos/{id}"; ????RestTemplate restTemplate = new RestTemplate(); ????restTemplate.setMessageConverters(getMessageConverters()); ????HttpHeaders headers = new HttpHeaders(); ????headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML)); ????HttpEntity<String> entity = new HttpEntity<String>(headers); ????ResponseEntity<Foo> response = ??????restTemplate.exchange(URI, HttpMethod.GET, entity, Foo.class, "1"); ????Foo resource = response.getBody(); ????assertThat(resource, notNullValue()); } private List<HttpMessageConverter<?>> getMessageConverters() { ????XStreamMarshaller marshaller = new XStreamMarshaller(); ????MarshallingHttpMessageConverter marshallingConverter = ??????new MarshallingHttpMessageConverter(marshaller); ????converters.add(marshallingConverter);
?
1 2 3 ????List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>(); ????return converters; }

5.3. Retrieving a Resource with?application/json?Accept header

Similarly, let’s now consume the REST API by asking for JSON:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 @Test public void givenConsumingJson_whenReadingTheFoo_thenCorrect() { ????String URI = BASE_URI + "foos/{id}"; ????RestTemplate restTemplate = new RestTemplate(); ????restTemplate.setMessageConverters(getMessageConverters()); ????HttpHeaders headers = new HttpHeaders(); ????headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); ????HttpEntity<String> entity = new HttpEntity<String>(headers); ????ResponseEntity<Foo> response = ??????restTemplate.exchange(URI, HttpMethod.GET, entity, Foo.class, "1"); ????Foo resource = response.getBody(); ????assertThat(resource, notNullValue()); } private List<HttpMessageConverter<?>> getMessageConverters() { ????List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>(); ????converters.add(new MappingJackson2HttpMessageConverter()); ????return converters; }

5.4. Update a Resource with XML?Content-Type

Finally, let’s also send JSON data to the REST API and specify the media type of that data via the?Content-Type?header:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @Test public void givenConsumingXml_whenWritingTheFoo_thenCorrect() { ????String URI = BASE_URI + "foos/{id}"; ????RestTemplate restTemplate = new RestTemplate(); ????restTemplate.setMessageConverters(getMessageConverters()); ????Foo resource = new Foo(4, "jason"); ????HttpHeaders headers = new HttpHeaders(); ????headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); ????headers.setContentType((MediaType.APPLICATION_XML)); ????HttpEntity<Foo> entity = new HttpEntity<Foo>(resource, headers); ????ResponseEntity<Foo> response = ??????restTemplate.exchange(URI, HttpMethod.PUT, entity, Foo.class, resource.getId()); ????Foo fooResponse = response.getBody(); ????Assert.assertEquals(resource.getId(), fooResponse.getId()); }

What’s interesting here is that we’re able to mix the media types –?we are sending XML data but we’re waiting for JSON data back from the server. This shows just how powerful the Spring conversion mechanism really is.

6. Conclusion

In this tutorial, we looked at how Spring MVC allows us to specify and fully customize Http Message Converters to?automatically marshall/unmarshall Java Entities to and from XML or JSON. This is of course a simplistic definition, and there is so much more that the message conversion mechanism can do – as we can see from the last test example.

We have also looked at how to leverage the same powerful mechanism with theRestTemplate?client – leading to a fully type-safe way of consuming the API.

轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/4424630.html

《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Http Message Converters with the Spring Framework--转载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。