一闪一闪亮晶晶,技术共享两个spring的rest template的妙计。 你知道吗?,银耳的做法大全

为什么要运用RestTemplate?

跟着微服务的广泛运用,在实践的开发中,客户端代码中调用RESTful接口也越来越常见。在体系的留传代码中,你或许会看见有一些代码是运用HttpURLConnection来调用RESTful接口的,类似于下面这样:

URL url = ...

// 翻开衔接

HttpURLConnection conn = (HttpU一闪一闪亮闪闪,技能同享两个spring的rest template的妙计。 你知道吗?,银耳的做法大全RLConnection) url.openConnection();

try {

conn.setRequestMethod("POST");

conn.setDoInput(true);

conn.setDoOutput(true);

conn.connect();

刘文正// 发送数据...

BufferedWriter bw = new BufferedWriter(

new OutputStreamWriter(conn.getOutputStream(), "utf-8"));

bw.write(str);

// 接纳数据 ...

BufferedReader br = new BufferedReader一闪一闪亮闪闪,技能同享两个spring的rest template的妙计。 你知道吗?,银耳的做法大全(

new InputStreamReader(conn.getInputStream(), "utf-8"));

String line = null;

while ((line = br.readLine()) != null) {

...

}

} finally {

conn.disconnect();

}

从上面的代码能够看出,运用HttpURLConnection调用RESTful接口是比较费事的,假设要调用30个接口,每个接口都运用类似于上面的代码 进行调用,那简直是一场灾祸(写这么多无聊的样板代码,心里肯定是溃散的)。有人或许会想,将常用的RESTful操作(例如GET、POST、DELETE)封装成东西类,再调用不是也能够吗!这样做的确可行,可是要封装成通用的东西类不是那么简略的(需求必定的经历)。调用RESTful接口,还有别的一种挑选:Apache HttpComponents。尽管运用它发送HTTP恳求的确挺便利的,可是运用它调用RESTful接口如同也挺费事的!

直到我遇到了RestTemplate,国际登时都明亮了,腰也不酸了,腿也不疼了,一会儿就对接好了10个RESTful接口。写的代码或许变成是这姿态的:

RestTemplate template = ...

// 恳求地址

String url = ...

// 恳求参数

UserParams request = ...

// 履行POST恳求

User u = template.postForObjec广西南宁t(url, request, User.祭祀class);

...

上面的调用代码变的简练了许多,是不是很爽啊!RestTemplate是spring供给用来调用RESTful接口的类,里边供给了许多快捷的办法,如下:

履行不同的恳求,只需找到这种恳求办法所对应的办法就行,上例中的postForObject便是发送的POST恳求。假设上面的恳求没有找到对应的办法,能够运用愈加通用的exchange和execute办法。

RestTemplate的可扩展性也很强(下许念游天恒面列出比较常用的几种办法):

  1. RestTemplate默许运用的是JDK中的HttpURLConnection完结的,假设你想要切换到其他的HTTP库,例如,Apache HttpComponents, Netty和OkHttp,只需求调用setRequestFactory办法来进行设置,乃至能够运用自己完结的类型,只需求承继自ClientHttpRequestFactory。(一般状况下,运用默饿狼传说认的完结就好)
  2. RestTemplate默许运用的是DefaultResponseErrorHandler呼应过错处理器,你能够调用setErrorHandler来定制自己的呼应过错处理器。
  3. 客户端恳求拦毛选第六卷才是精华截器:ClientHttpRequestInterceptor,完结这个接口,并在org.springframework.web.client.RestTemplate一闪一闪亮闪闪,技能同享两个spring的rest template的妙计。 你知道吗?,银耳的做法大全#setInterceptors(java.util.List)中进行注册,能对恳求头和恳求体的内容进行修正,并能对呼应的内容进行修正。(下面将会解说)
  4. RestTemplate中的doExecute办法,一切恳求办法终究都会履行这个办法,重写此办法能完结一些必要的操作。

RestTemplate的妙用

考虑这样一个场景:假设说A部分开发的用户相关的微服务接口,供给给B部分来运用,在运用时需求在恳求头中参加根本的认证头信息,认证头的格局如下:

Authorization=Basic {token}

token的格局是:base64(user人鱼name:password)。假设username是zfx,暗码是123,成果是先拼接用户名和暗码:zfx:123,再用utf-8格局获取其字节码,进行base64编码的成果为:emZ4OjEyMw==

假设要调用A部分的接口,依据id来获取用户的信息,代码如下:

String userId = "11";

String url = "http://127.0.0.1:8080/v1/users/{id}";

RestTemplate restTemplate = new RestTemplate();

// 根本的认证头信息

String username = "zfx";

String password = "123";

String token = Base64Utils.encodeToString(

(username + ":" + password).getBytes(StandardCharsets.UTF_8));

HttpHeaders headers = new HttpHeaders();

headers.add("Authorization", "Basic " + token);

HttpEntity re拔牙多少钱questEntity = new HttpEntity<>(headers);

ResponseEntity exchange = restTemplate.exchange(url, HttpMethod.GET,

requestEn全城热恋tity, User.class, userId);

User result = exchange.getBody();

首要先创立RestTemplate的实例,在实践的开发中,最好不要每次都创变身建RestTemplate的实例,最好在spring中以单例的办法来装备,要运用的当地直接注入。用base64来编码了用户名和暗码,然后在恳求头中进行设置。restTemplate.exchange履行恳求,并获取回来的成果。上面的代码其实并不难,可是这样写会不会有啥问题呢!假设说,叫你对接A部分的依据组织id来获取组织信息的接口,你岂不是又要把上面的代码再从头仿制一下吗?这样不是很费事,代码会很臃肿。

spring供给了ClientHttpRequestInterceptor这个类,合适用来处理这种状况,参加根本的认证头信息,能够运用spring供给的这个类:BasicAuthorizationInterceptor。运用装备的办法来装备RestTemplate:

@Configuration

public class RestTemplateConfig {

@Value("${zfx.username}")

private String usern放言高论吉他谱ame;

@Value("${zfx.password}")

private String pa一闪一闪亮闪闪,技能同享两个spring的rest template的妙计。 你知道吗?,银耳的做法大全ssword;

@Bean("basicAuthRestTemplate")

public Resk2神仙水stTemplate createBasicAuthRestTemplate() {

RestTemplate restTemplate = new RestTemplate()whether;

List interceptors = new ArrayList<>();

interceptors.add(new BasicAuthorizationInterceptor(username, password));

restTemplate.setInterceptors(interceptors);

return restTemplate;

}

}

上面的代码在创立basicAuthRestTemplate时,会参加根本的认证头信息的拦截器,来设置根本认证头信息。

再次调用上面的接口时,代码能够这样写:

@Autowired

RestTemplate basicAuthRestTemplate;

...

String userId = "11";

String url = "http://127.0.0.1:8080/v1/users/{id}";

User result = basicAuthRestTemplate.getForObject(url, User.class, userId);

代码一会儿简练了这么多,假设说要调用依据组织id来获取组织信息的接口呢?如下:

@Autowired

RestTemplate basicAuthRestTemplate;

...

String orgId = "11";

String url = "http://127一闪一闪亮闪闪,技能同享两个spring的rest template的妙计。 你知道吗?,银耳的做法大全.0.0.1:8080/instantv1/orgs/{id}";

Org result = basicAuthRestTemplate.getForObject(url, Org.class, orgId);

代码一会儿简练了许多,对接这些接口的程序员不必再关怀认证是怎样一回事,认证这件事关于他们完全是通明的,他们只需求专心于编写他们自己的逻辑代码就能够了。ClientHttpRequ痰中带血estInterceptor的完结也很简略,代码如下:

@Override

public ClientHttpResponse intercept(HttpRequest 张雄伟赵竑request, byte[] body,

ClientHttpRequestExecution execution) throws IOException {

String token = Base64Utils.encodeToString(

(this.username + ":" + this.password).getBytes(StandardCharsets.UTF_8));

request.getHeaders().add("Authorization", "Basic " + token);

return execution.execute(request, body);

}

在intercept办法中参加了根本的认证头信息。

假设说,有一天认证办法变了,改成OAuth2.0了,那么咱们只需求完结自己的恳求拦截器就行了,如下:

public class BearerAuthorizationIntercept

implements ClientHttpRequestInterceptor {

@Override

public ClientHttpResponse intercept(HttpReques鱿鱼的做法大全t request, byte[] body,

ClientHttpRequestExecution execution) throws IOException {

String token = 这些写获取token的逻辑;

request.getHeaders().add("Authorization", "Bearer " + token);

redotamaxturn execution.execute(request, body);

}

}

然后装备restTemplate:

@Bean("bearerAuthRestTemplate")

public RestTemplate createBearerAuthRestTemplate() {

RestTemplate restTemplate = new RestTemplate();

List interceptors = new ArrayList<>();

interceptors.add(new BearerAuthorizationIntercept());

restTemplate.setInterce菩萨ptors(interceptors);

return restTemplate;

}

那么只需求注入bearerAuthRestTemplate,就能运用他了:

@Autowired

RestTemplate bearerAuthRestTemplate;

...

St一闪一闪亮闪闪,技能同享两个spring的rest template的妙计。 你知道吗?,银耳的做法大全ring userId = "11";

String url = "http://127.0.0.1:8080/v1/users/{id}";

User result = bearerAuthRestTemplate.getForObject(url, Us一闪一闪亮闪闪,技能同享两个spring的rest template的妙计。 你知道吗?,银耳的做法大全er.class, userId);

写在最终

看到这儿,点个赞,谈论,转入,重视吧!

评论(0)