接口调用的两种方式HttpClient以及spring cloud的@Feign方式

本文探讨了HttpClient和Feign两种接口调用方式的适用场景。HttpClient适合复杂参数和不确定返回值类型的接口,如文件上传和下载。Feign则在参数明确、返回值简单的场景下更简便。然而,Feign对某些复杂接口支持有限,如上传文件和处理特定返回类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于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().
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值