如何用java写一个简单的http client端?或者如何用java快速高效的写一个http请求?目前我们实现方式无非就是下面2种:
1.采用JAVA语言原生的HttpURLConnection类自己做一个;
2.采用apache HTTPClient这类第三方库,自己封装数据进行请求。
采用第三方库,能简化我们的工作快速上手,但目前第三方库的工具如HTTPClient使用时,如我们需要json格式请求,对于请求参数等,需要自己设计和序列化再发送,这部分的工作是没法简化的。我之前遇到过一个json rpc客户端实现,发现其可以用对应的代理组件,不需要自己去封装请求参数的序列化实现,就能构造一个http client端来完成对服务端的访问。那么,有没有类似的工具,一样简单方便的实现http client完成一个正常的http 协议的访问呢?
答案是:有。那就是Spring Cloud 的Feign组件。
Spring Boot/Spring Cloud目前已经开始成为JAVA开发的必备框架和工具。相信大家都不陌生。陌生的请自己上网去找对应的入门教程。这里假定你有一定的spring boot的基础。那么,我们要怎么做呢?OK,下面我将一步步演示我的构建过程,看完后,应该能处理90%的java http请求的实际应用场景。
第1步:搭建2个Spring boot工程。均选用默认参数。因为是简单demo,均添加Web组件即可。其中一个工程命名为calculatorservice,作为测试用的服务端。另外一个工程命名为feigndemo,作为demo的http 请求端。
第2步:在calculatorservice工程添加一个简单计算器请求服务。作为测试用http请求服务器。最后,启动该工程,这里用8080端口,进行add接口测试。在浏览器输入:http://localhost:8080/api/add?x=9&y=11。输出结果:{"result":20,"code":"0","test":"123456789","statment":"9+11","alg":"+"}。保证这部正确后,再做下一步。
实现代码如下:

第3步:在feigndemo工程pom文件中添加spring cloud及feign组件的依赖。如下:

第4步:@FeignClient注解构建代理式服务,为一个接口类。这里命名为DemoService。上代码。其中声明了post和get接口。测试两类请求。这里,需要注意,@FeignClient注解意思是这个接口类为feign组件,其value值是该组件的名字demo。url为其访问的url地址。这里用 ${demoaddr.url}表示这里可以配置。如果这么写,也必须配置。其值,这里配置为第2步的计算服务类api地址:demoaddr.url = http://localhost:8080/api,它和对应接口上的注解值,如@GetMapping("/add"), 一起形成一个完整的http api url地址:http://localhost:8080/api/add. 因此,这里要特别注意,@GetMapping注解里面的参数,必须和真正的后台服务的api的接口名称完全一致。这样才能形成一个正确的http请求地址。此外,对于请求参数,参数名称必须和对应的后台服务请求参数名称完全一致。即注解@RequestParam等中的名称和代理的后台服务名称一致。保证这两点一致,才能形成正确的对后台服务的http请求。其它则可不一致。

第5步:最后,在工程feigndemo中实现一个controller类来处理外部的http请求。这里命名为DemoController类。在该类用@Autowired注解声明上一步做好的接口类实例。然后就可在后面的api中用这个接口类来进行后台服务的http请求了。而该Controller类的api地址和参数名称自由定义,无任何限制。同时将该服务port设置为8888. server.port = 8888。Controller代码如下:

第6步,至此,一个简单的Feign组件搭建的http client(或称服务转接器)就完成了。下面测试add接口。在浏览器中输入:http://localhost:8888/demo/add?x=9&y=11。结果如下:
{"method":"HTTP GET","reply":{"code":"0","alg":"+","result":20,"statment":"9+11","test":123456789},"status":"succeed"}
同样,测试post请求也OK。
通过上面的6步,我们就简单的实现了一个基于spring cloud feign组件的http client, 并对外提供feigndemo服务。而在该Controller类中不再需要进行请求参数的序列化了。编码变得简单了。
网友评论