TechRoad_Arc_Service_RESTful Web service

目标: 整理企业架构中的服务领域知识- RESTful web service

1.应用场景

使用广泛, 从借助 HTTP 的远程服务调用到支持Ajax样式的交互式Web前端。 REpresentational state transfer 一种架构央视,REST定义了一组架构约束,

共同描述了一个访问资源的统一接口,通过不同的表达形式来识别和操作资源。为了识别资源,应通过统一资源标识符 URI访问一条信息。

1. 易于理解, GET 获取资源,Head 没有响应主体,通常用于获取标题,Post 创建新的资源,PUT 更新资源,DELETE删除资源,OPTION 检索允许的HTTP方法。

RESTful web service 是围绕HTTP设计的, URL 和 HTTP 方法一起指定了请求的意图。

2. 轻量级:与基于SOAP的web服务相比更轻量, 包含了大量的元数据来描述客户端希望调用的服务, 对于RESTful web 请求和响应,作为HTTP请求和响应与其他任何Web应用程序一样。

3. 防火墙友好: 被设计为可通过HTTP/HTTPS 方法.

 

2 要点:

1. 因为是从服务端发送对象到客户端,需要进行序列化和反序列化。 XML 和 JSON 

          <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.6</version>
      </dependency>

     <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.11.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.11.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.3</version>
        </dependency>

如需 xml,  spring-oxm ( 提供Spring 对象到 xml映射); castor-xml  (用于 XML数据的编组和解组); 

 

org.apache.httpcomponents:httpclient : HTTP客户端库 将用于 Restfull-ws 调用。

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>

 

2. 使用Spring MVC 将服务公开为 RESTful web service

序列化时, xml 需要构造对象的列表专有类, order -> orders { List<Order> orders;} ...;  JSON 的化不需要

 

 

 @PathVariable Long id, Spring 的类型转换系统会自动处理从 String 到 Long的转换。

@RequestBody 指定 Spring 自动将Http请求体内的内容绑定到 Singer 域对象。

该转换将通过 HttpMessageConvert<Object>接口的声明实例来完成以获得支持格式。


 

需要Spring web 应用程序来解析客户端发送的 REST请求.

 1 **
 2  * responsibility :
 3  *
 4  * 由于需要 Spring web 应用程序来解析客户端发送的 REST 请求,因此需要对其进行配置。
 5  *
 6  * spring web 应用程序遵循 Front controller 模式,所有请求都有单个控制器接收,然后分派给相应的处理程序(控制器类)
 7  * 中央调度程序时 org.springframework.web.servlet.DispatcherServlet的一个实例,
 8  * 由 AbstractAnnotationConfigDispatcherServletInitializer 类进行注册,
 9  * 需要对该类进行扩展以替换 web.xml配置
13  */
14 
15 public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
16 
17     /**
18      * 在 Spring Mvc中,每个DispatcherServlet都将拥有自己的 WebApplicationContext,但是
19      * DataServiceConfig.class 中定义的所有服务层bean(称为根 WebApplicationContext) 也
20      * 可以作为每个 servlet 的 WebApplicationContext.
21      * @return
22      */
23     @Override
24     protected Class<?>[] getRootConfigClasses() {
25         return new Class[0];
26     }
27 
28     @Override
29     protected Class<?>[] getServletConfigClasses() {
30         return new Class<?>[]{ WebConfig.class}; // extends WebMvcConfigurer
31     }
32 
33     /**
34      * 指示 Web容器(e.g Tomcat) 将模式/下的所有 URL e.g http://localhost:8080/singer 都交由
35      * RESTful servlet 进行处理。
36      * @return
37      */
38     @Override
39     protected String[] getServletMappings() {
40         return new String[]{"/"};
41     }
42 }

 

@EnableWebMvc 注解秦俑了对 Spring MVC 的注解,即@Controller注解,并注册了Spring的类型转换和格式化系统,还启用了 JSR-303 验证支持。

 1 @Configuration
 2 @EnableWebMvc
 3 @ComponentScan(basePackages = {
 4         "org.techroad.arc.service"
 5 })
 6 public class WebConfig implements WebMvcConfigurer {
 7 
 8     @Autowired
 9     ApplicationContext ctx;
10 
11     @Bean
12     public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){
13         MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter =
14                 new MappingJackson2HttpMessageConverter();
15         mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper());
16         return mappingJackson2HttpMessageConverter;
17     }
18 
19     @Bean
20     public ObjectMapper objectMapper(){
21         ObjectMapper objMapper = new ObjectMapper();
22         objMapper.enable(SerializationFeature.INDENT_OUTPUT);
23         objMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
24         DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
25         objMapper.setDateFormat(df);
26         return objMapper;
27     }
28 
29     @Override
30     public void configureDefaultServletHandling(DefaultServletHandlerConfigurer
31                                                 configurer){
32         configurer.enable();
33     }
34 
35     // 声明了用作支持格式的媒体转换的 HttpMessageConvert实例
36     // 如果需要解析XML,则添加 MarshallingHttpMessageConverter
37     @Override
38     public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
39         converters.add(mappingJackson2HttpMessageConverter());
40     }
41 }
使用 crul 测试 RESTful-WS

 


 

posted @ 2020-11-08 16:25  君子之行  阅读(15)  评论(0)    收藏  举报