金沙手机APP架构实战篇

金沙手机APP 1Spring
Boot RestTemplate.jpg

前言

Spring Boot
提供的restful服务这么方便,那有没有方便的调用方式呢?当然有了那就是RestTemplate

一、什么是RestTemplate

传统情况下在java代码里访问restful服务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐。spring提供了一种简单便捷的模板类来进行操作,这就是RestTemplate。

二、启动服务

我们使用前一篇文章《架构实战篇:Spring Boot
表单验证和异常处理》做服务端提供服务

启动完毕后访问

三、Java 客户端

让我们先来看下项目的目录结构

金沙手机APP 2目录结构

四、配置maven依赖

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.itunion</groupId> <artifactId>spring-boot-resttemplate</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <!-- 打war包用 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> </dependencies> <packaging>war</packaging> <properties> <java.version>1.7</java.version> </properties> <build> <!-- 打war包用 --> <finalName>swagger</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- 打war包用,maven打包的时候告诉maven不需要web.xml,否刚会报找不到web.xml错误 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> <!-- --> </plugins> </build></project>

五、编写程序入口

程序的入口基本都一样

package com.itunion;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import java.io.IOException;@SpringBootApplicationpublic class Application { public static void main(String[] args) throws IOException { SpringApplication.run(Application.class, args); }}

六、RestTemplate 配置

在这里我们可以设置连接的超时时间 代理 等信息

package com.itunion.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.client.ClientHttpRequestFactory;import org.springframework.http.client.SimpleClientHttpRequestFactory;import org.springframework.web.client.RestTemplate;@Configurationpublic class ApiConfig { @Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory) { return new RestTemplate; } @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setReadTimeout;//单位为ms factory.setConnectTimeout;//单位为ms return factory; }}

七、编写API 返回对象

API
请求肯定少不了返回对象,为了方便类型转换我们把User类复制了过来(实际开发中可以把api
公共的domain 等类带jar 包出来)

package com.itunion.model;import com.fasterxml.jackson.annotation.JsonIgnore;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;@ApiModelpublic class User { @ApiModelProperty private Long id; @ApiModelProperty private String username; @ApiModelProperty private String firstName; @ApiModelProperty private String lastName; @ApiModelProperty private String email; @ApiModelProperty(hidden = true)// 密码不传输 @JsonIgnore private String password; @ApiModelProperty private Integer userStatus; // get set @Override public String toString() { return "User{" + ", username='" + username + '\'' + ", firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", email='" + email + '\'' + ", password='" + password + '\'' + ", userStatus=" + userStatus + '}'; }}

异常类

package com.itunion.model;import java.o.Serializable;public class ErrorBody implements Serializable { private Integer code; private String message; private long timestamp = System.currentTimeMillis(); // get set @Override public String toString() { return "ErrorBody{" + "code=" + code + ", message='" + message + '\'' + ", timestamp=" + timestamp + '}'; }}

八、使用RestTemplate 远程调用

这里我们写了两个方法

  1. 当远程接口正常返回结果的时候我们会封装成User对象返回到前端
  2. 当远程调用返回 RestClientResponseException
    异常的时候封装成ErrorBody对象(比如传入参数不合法等数据验证,不能返回逾期结果的时候会返回Error信息,这时候需要做处理)

package com.itunion.controller;import com.fasterxml.jackson.databind.ObjectMapper;import com.itunion.model.ErrorBody;import com.itunion.model.User;import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;import org.springframework.web.client.HttpClientErrorException;import org.springframework.web.client.RestTemplate;import java.io.IOException;@Api(value = "用户", description = "用户")@RequestMapping@RestControllerpublic class UserController { @Autowired private RestTemplate restTemplate; @ApiOperation(value = "调用远程用户服务", notes = "调用远程用户服务") @RequestMapping(value = "/info/{userId}", method = RequestMethod.GET) public User info(@PathVariable String userId) throws IOException { String apiURL = "http://localhost:8081/swagger/user/info/" + userId; return restTemplate.getForObject(apiURL, User.class); } @ExceptionHandler(RestClientResponseException.class) public ErrorBody exceptionHandler(HttpClientErrorException e) throws IOException { return new ObjectMapper().readValue(e.getResponseBodyAsString(), ErrorBody.class); }}

九、修改端口

为了同时启动两个服务端口肯定是不能一样的了

server.port=8082server.context-path=/swagger.enable=true

十、启动程序和验证

服务端成功启动

金沙手机APP 3服务端成功启动

客户端成功启动

金沙手机APP 4客户端成功启动

访问客户端页面

测试正确的请求参数

金沙手机APP 5设置参数金沙手机APP 6验证正确结果

测试错误的请求参数

金沙手机APP 7设置参数金沙手机APP 8验证异常结果

好了 RestTemplate 的简单实用就到这里了

架构实战篇:Spring Boot 整合MyBatis架构实战篇:Spring Boot
整合Swagger2架构实战篇:Spring Boot 整合MyBatis架构实战篇:Spring Boot
整合 Thymeleaf架构实战篇:Spring Boot
表单验证和异常处理架构实战篇:Spring Boot RestTemplate的使用

如果需要源码可以关注“IT实战联盟”公众号并留言,小萌看到后会联系作者发送到邮箱,也可以加入交流群和作者互撩哦~~~!

金沙手机APP 9

相关文章