关于Httpclient以及feign两种方式的选择
对于简便性来说,一定是feign,但是不是所有情况都可以用feign的。因此:
当,明确你调用接口需要的参数,并且明确返回值类型,并且返回值类型是简单的一些数据类型就首选feign这种方法,因为真的简单啊!!!
但是很多情况是对于参数设置无法明确,比如,我在调用其中一个上传文件的接口的时候,因为那个api需要上传一个from-data文件,因此无法成功(也试过MultipartFile这个类型)因此就只能选用httpclient。还有有时候,是返回值无法确定的情况,我在封装下载接口的时候,也曾试过feign类型,用简单的String接受调用接口的返回,因为调用接口返回的是文件,简单的String类型一定会出现问题(乱码,图片无法查看等问题)
所以feign这个方法限制的比较多
Httpclient
需要的包:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
</dependency>
相关博客参考: HttpClient详细使用示例
Httpclient,是一个工具,许多人把它当作是一个浏览器,是的,它可以帮你像浏览器一样,向一个url发出请求,并且获得相应的响应(返回值),因此这个功能就可以帮你完成接口调用的工作,你在你的接口用httpclient向一个url发出请求,并且获得返回值,不就是完成了接口的调用嘛。但是httpclient仅仅是通用浏览器应用程序所期望的功能子集。
emmmm,正如参考博客中所说的,可能httpclient有许多的功能,但是目前我仅仅简单的了解一部分功能。因此仅仅罗列目前了解以及接触过的功能:
httpclient功能:
1.实现了所有 HTTP 的方法(GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS 等)
2.支持 HTTPS 协议
3.支持自动(跳转)转向
httpclient整体的使用方法的总结
1.创建CloseableHttpClient对象。(可以类似的理解成一个浏览器)
2.创建一个请求,明确是post请求还是get请求。
3.创建一个CloseableHttpResponse ,用于接受相关的响应。
4.可以setHeader,依据需求进行相应的设置。可以setConfig,当然一些不正当的设置,也会使得请求不成功,例如,在文件上传的时候,如果设置headers的content-Type为multipart/form-data就会发生错误。
4.执行请求
5.解析获得的响应。
httpclient实现文件的上传
直接上代码:
public String httpClientUploadFile(String url,String uploadPath) {
//上传文件
//url为需要请求的url,也是调用的接口,注意如果api本身是有参数的,需要带上,也就是?参数名=值结尾
//uploadPath,为本地的文件所在的路径。
CloseableHttpClient httpClient = HttpClientBuilder.create().build();//创建浏览器(仅限于理解)
String result = "";
int status = 0;
try {
HttpPost httppost = new HttpPost(url);//创建请求
File myfile = new File(uploadPath);//包装需要上传的文件
/*
需要将文件放在 HttpEntity(消息实体对象中),但是首先需要将文件放在MultipartEntityBuilder对象中,利用这个对象的addBinaryBody("file",文件名);
**/
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
multipartEntityBuilder.addBinaryBody("file",myfile);
multipartEntityBuilder.addTextBody("comment", "this is comment");
HttpEntity httpEntity = multipartEntityBuilder.build();//创建实体
httppost.setEntity(httpEntity);
HttpResponse response = httpClient.execute(httppost);//执行http请求,返回响应
status = response.getStatusLine().