项目中请求第三方平台的方式

doMore 259 2023-09-21

前言

在工作中避免不了需要从别的系统(本公司、或者别的数据平台)获取数据。在自己的项目中需要发送 Http 请求。这就引申出一个问题,如何优雅的去发送这些 http 请求?

正文

申明

此处使用 org.apache.httpcomponents:httpclient 作为发送 http 的工具。
默认以 tomcat 为部署项目的容器

方式一

每当我们有需要请求别的平台的需求时,我们在自己项目中新建一个接口,自己做转发。别的平台需要什么参数,我们的系统就需要定义对应的参数接收。

// org.apache.http.client.HttpClient#execute(org.apache.http.HttpHost, org.apache.http.HttpRequest)

@PostMapping("/send")
public Object sendRequest(Object requestParam){
	httpClient = createHttpClient();
	return httpClient.execute(URIUtils.extractHost(new URI(targetUri)),new BasicHttpRequest(method, targetUri));
}

上述只是极其简单的一种方式,真是的场景中我们会做点别的事情。比如:记录请求日志,或者添加固定的 Headers。

方式二

使用一种类似代理的方式封装起来。具体的实现可以参考下面的开源项目。

<groupId>org.mitre.dsmiley.httpproxy</groupId>  
<artifactId>smiley-http-proxy-servlet</artifactId>  
<version>1.12.1</version>

<!-- https://github.com/dsmiley/HTTP-Proxy-Servlet -->

简单阐述一下思路。以 springboot 为例,默认会启动 DispatcherServlet 作为寻找我们编写的 controller 接口的入口。 它的 urlMapping 如果不进行特殊配置,默认会是 "/"。
这里的方式其实是 自己另外在 spring 容器中注册一个 httpServlet ,并且封装一些对外的请求和响应方法。urlMapping 设置为自己想要请求的第三方 比如:"/baidu/**"。

方式三

不像第二种方式那样,自己重新注册一个 servlet ,而是自己提供一个 controller ,将要请求的地址作为参数。和第一种差不多,进行了一次统一得封装。

比较

第二种方式对于自己项目来说更加简单,明面上是请求自己的系统,其实和直接去请求第三方系统一样,通常对这样的方式进行拦截和验证都比较麻烦,而且这里和第三方的交互毕传参数会抛出给对接系统,造成同一份配置 维护在多处,改动成本比较大。
第一种的话又需要编写大量的代码,耗时耗力。
第三种更综合一些,拦截方便,而且代码量也不会很大,但是需要很好的封装技巧。

总结

仅以个人拙见,叙述自己了解到的方式,如有更好的方式,欢迎交流。