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


浙公网安备 33010602011771号