本文实例为大家分享了HttpClient实现远程调用的具体代码,供大家参考,具体内容如下

依赖:

<dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.6</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.58</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.5.5</version>
</dependency>

服务提供者:

/**
    * get请求
*/
    @GetMapping("/gte3")
    public AjaxResult getGuke3(Integer id) throws Exception {
        System.err.println("id:"   id);
        Uesr uesr = new Uesr();
        uesr.setId(11);
        uesr.setName("chen");
        return AjaxResult.success(uesr);
    }

/**
*post请求
*/
@PostMapping("/test001")
    public AjaxResult post1(@RequestBody Uesr uesr) {

        System.err.println(uesr.getId()   uesr.getName());
        return AjaxResult.success(1);
    }   

/**
     * 文件上传
     */
    @PostMapping("/test14")
    public AjaxResult test14(MultipartFile multipartFile, String id, String fileMd5) throws IOException {
        System.err.println(id);
        System.err.println(fileMd5);        final InputStream inputStream = multipartFile.getInputStream();
        int i = 0;
        while ((i = inputStream.read()) != -1) {
            char c = (char) i;
            System.err.println(c);
        }
        return AjaxResult.success(1);
    }

封装的工具类:

package cn.sotos;

import cn.sotos.util.AjaxResult;
import cn.sotos.util.Uesr;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;

import org.apache.http.ParseException;

import org.apache.http.client.methods.*;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;


import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @program: exportool
 * @description:
 * @author: hu.chen
 **/
public class HttpClientHelper {

    private static CloseableHttpClient httpClient = HttpClientBuilder.create().build();

    public static void main(String[] args) throws Exception {
        HttpClientHelper httpClientHelper = new HttpClientHelper();
        //get请求
        Map<String, Object> mapget = new ConcurrentHashMap<>();
        mapget.put("id", 1);
        AjaxResult<Uesr> resultGet = httpClientHelper.doGet("http://127.0.0.1:8081/gte3", mapget, null, Uesr.class);

        System.err.println(resultGet.getCode());
        System.err.println(resultGet.getMsg());

        final Uesr uesr = resultGet.getData();
        System.err.println(uesr.getName());


        //post请求
        Map<String, Object> mappost = new ConcurrentHashMap<>();
        mappost.put("id", 2);
        mappost.put("name", "陈虎001post");
        Uesr uesr1 = new Uesr();
        uesr1.setName("chenpost");
        uesr1.setId(001);
        AjaxResult<Integer> resultPost = httpClientHelper.doPost("http://127.0.0.1:8081/test001", uesr1, null, Integer.class);

        System.err.println(resultPost.getCode());
        System.err.println(resultPost.getMsg());

        final Integer nteger = resultPost.getData();
        System.err.println(nteger);

        //文件请求
        List<File> files = new ArrayList<>();
        File file = new File("D:/t.txt");
        files.add(file);

        Map<String, String> mapfile = new ConcurrentHashMap<>();
        mappost.put("id", " 2");
        mappost.put("fileMd5", "陈虎001file");

        AjaxResult<Integer> resultFile = httpClientHelper.updataFile("http://127.0.0.1:8081/test14", "multipartFile", files, mapfile, Integer.class);
        final Integer ntegerfile = resultFile.getData();
        System.err.println(ntegerfile);
    }


    /**
     * 带参数的get请求
     *
     * @param url          请求地址
     * @param parameValues 参数
     * @param headerValues    请求头参数
     * @param clazz          返回参数类型
     * @return
     * @throws Exception
     */
    public <T> AjaxResult doGet(String url, Map<String, Object> parameValues, Map<String, String> headerValues, Class<T> clazz) throws Exception {
        // 声明URIBuilder
        URIBuilder uriBuilder = new URIBuilder(url);
        // 判断参数map是否为非空
        if (parameValues != null) {
            // 遍历参数
            for (Map.Entry<String, Object> entry : parameValues.entrySet()) {
                // 设置参数
                uriBuilder.setParameter(entry.getKey(), entry.getValue().toString());
            }
        }
        // 2 创建httpGet对象,相当于设置url请求地址
        HttpGet httpGet = new HttpGet(uriBuilder.build());
        /*
         * 添加请求头信息
         */
        //判断请求头是否不为空
        if (headerValues != null) {
            for (Map.Entry<String, String> entry : headerValues.entrySet()) {
                httpGet.addHeader(entry.getKey(), entry.getValue());
            }
        }
        // 传输的类型
        httpGet.addHeader("Content-Type", "application/x-www-form-urlencoded");
        // 3 使用HttpClient执行httpGet,相当于按回车,发起请求
        CloseableHttpResponse response = httpClient.execute(httpGet);

        // 4 解析结果,封装返回对象httpResult,相当于显示相应的结果
        return pasResponse(response, clazz);
    }

    /**
     * 带参数的post请求
     *
     * @param url       请求地址
     * @param parameter 参数
     * @param headerValues 请求头参数
     * @param clazz       返回参数类型
     * @return
     * @throws Exception
     */
    public <T> AjaxResult doPost(String url, Object parameter, Map<String, String> headerValues, Class<T> clazz) throws Exception {
        // 声明httpPost请求
        HttpPost httpPost = new HttpPost(url);

        setParam(httpPost, parameter, headerValues);
        // 传输的类型
        httpPost.addHeader("Content-Type", "application/json; charset=UTF-8");

        // 使用HttpClient发起请求,返回response
        CloseableHttpResponse response = httpClient.execute(httpPost);

        // 4 解析结果,封装返回对象httpResult,相当于显示相应的结果
        return pasResponse(response, clazz);
    }

    /**
     * 带参数的Put请求
     *
     * @param url       请求地址
     * @param parameter 参数
     * @param headerValues 请求头参数
     * @param clazz       返回参数类型
     * @return
     * @throws Exception
     */
    public <T> AjaxResult doPut(String url, Object parameter, Map<String, String> headerValues, Class<T> clazz) throws Exception {
        // 声明httpPost请求
        HttpPut httpPut = new HttpPut(url);

        setParam(httpPut, parameter, headerValues);
        // 传输的类型
        httpPut.addHeader("Content-Type", "application/json; charset=UTF-8");

        // 使用HttpClient发起请求,返回response
        CloseableHttpResponse response = httpClient.execute(httpPut);
        // 4 解析结果,封装返回对象httpResult,相当于显示相应的结果
        return pasResponse(response, clazz);
    }


    /**
     * 远程调用传输文件
     *
     * @param url          请求地址
     * @param fileKey      后端接收的文件参数的名称
     * @param files        文件集合
     * @param parameValues 其他参数
     * @param clazz 返回参数类型
     */
    public <T> AjaxResult updataFile(String url, String fileKey, List<File> files, Map<String, String> parameValues, Class<T> clazz) throws IOException {
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();

        HttpPost httpPost = new HttpPost(url);
        CloseableHttpResponse response = null;

        MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();

        //设置文件参数
        for (File file : files) {
            multipartEntityBuilder.addBinaryBody(fileKey, file, ContentType.DEFAULT_BINARY, URLEncoder.encode(file.getName(), "utf-8"));
        }

        //设置其他参数
        if (parameValues != null) {
            // 其它参数(注:自定义contentType,设置UTF-8是为了防止服务端拿到的参数出现乱码)
            ContentType contentType = ContentType.create("application/json", Charset.forName("UTF-8"));
            for (Map.Entry<String, String> entry : parameValues.entrySet()) {
                multipartEntityBuilder.addTextBody(entry.getKey(), entry.getValue(), contentType);
            }
        }
        HttpEntity httpEntity = multipartEntityBuilder.build();
        httpPost.setEntity(httpEntity);
        response = httpClient.execute(httpPost);

        // 4 解析结果,封装返回对象httpResult,相当于显示相应的结果
        return pasResponse(response, clazz);
    }


    /**
     * 设置参数
     *
     * @param parameter 请求参数
     * @param headerValues 请求头参数
     */
    private void setParam(HttpEntityEnclosingRequestBase requestBase, Object
            parameter, Map<String, String> headerValues) {
        // 判断参数是否不为空
        if (parameter != null) {
            // 在传送复杂嵌套对象时,一定要把对象转成json字符串,我这里实用的是alibaba.fastjson,当然你也可以使用其他的json工具
            StringEntity requestEntity = new StringEntity(JSON.toJSONString(parameter), "utf-8");
            requestEntity.setContentEncoding("UTF-8");
            requestBase.setEntity(requestEntity);
        }
        //判断请求头是否不为空
        if (headerValues != null) {
            for (Map.Entry<String, String> entry : headerValues.entrySet()) {
                requestBase.addHeader(entry.getKey(), entry.getValue());
            }
        }
    }

    /**
     * 封装返回结果
     *
     * @param response 数据集
     * @param clazz      参数类型
     * @param <T>
     * @return
     * @throws IOException
     */
    private <T> AjaxResult pasResponse(CloseableHttpResponse response, Class<T> clazz) throws IOException {
        AjaxResult<T> ajaxResult = null;
        try {
            // 解析数据封装HttpResult
            if (response.getEntity() != null) {
                ajaxResult = JSONObject.parseObject(EntityUtils.toString(response.getEntity(), "utf-8"), AjaxResult.class);
                ajaxResult.setData(JSONObject.parseObject(JSONObject.toJSONString(ajaxResult.getData()), clazz));
            } else {
                ajaxResult = new AjaxResult();
            }
        } catch (ParseException | IOException e) {
            System.err.println("返回结果转换失败"   e);
        } finally {
            try {
                // 释放资源
                if (response != null) {
                    response.close();
                }
            } catch (IOException e) {
                System.err.println("资源释放失败"   e);
            }
        }
        return ajaxResult;
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

HttpClient实现远程调用的更多相关文章

  1. ios – 使用MonoTouch,HttpClient和Charles Proxy时的HTTP流量监控问题

    我是HttpClient类的新手,我遇到了使用CharlesProxy监视请求的问题.基本上我需要的是监视从模拟器或实际iOS设备发出的请求.Here您可以找到有关如何配置CharlesforiOS开发的精彩教程.我正在制作简单的HttpClient请求,只是一个简单的授权代码有效,用户正在被授权,并且正在返回承载令牌.但是问题是,我在模拟器上的请求没有出现在Charleshttp流量监控列表中.

  2. 开发Swift iOS应用程序“正确的方式”

    最近,我学习了Swift和开发iOS应用程序的基础知识。现在,我想自己开发一个真正的应用程序,但我非常关心编写好的代码,所以我已经寻找“最佳实践”,“设计模式”和“正确的方式”来实现它。在我的搜索中,我发现这个greattutorial关于SwiftiOS应用程序中通常使用的所有设计模式,以及他们使用的示例。不应该将httpClient和persistencyManager声明为协议,然后HttpClient和PersistencyManager类实现该协议?我应该在哪里告诉应用程序?最后但并非最不重要的

  3. android – 用我非常简单的calabash测试用例不断得到错误“HTTPClient :: ReceiveTimeoutError”

    我是calabash-android测试自动化库的新手.我花了两天时间来理解这个问题没有成功:(我正在使用calabash-android版本0.8.0,我按照文档pre-definedsteps进行测试.我的测试很简单,只需等待登录界面(这是一个包含id为“email_field”的输入字段的活动),输入用户名和密码.这是我在功能文件中的步骤:当我使用命令calabash-android运行my

  4. Android httpclient – 获取具有抢先身份验证的文件

    我使用此示例代码获取网站的HTML代码时遇到问题.http://svn.apache.org/repos/asf/httpcomponents/httpclient/branches/4.0.x/httpclient/src/examples/org/apache/http/examples/client/ClientPreemptiveBasicAuthentication.java我必须使用上

  5. Android无法访问org.apache.http.client.HttpClient

    我正在使用androidstudio创建一个向服务器发出GET请求的应用程序.我的代码是这样的:问题是AndroidStudio标记了这一行有错误:说“无法访问org.apache.http.client.HttpClient”这是我的gradle文件:解决方法在AndroidSDK23中不推荐使用HttpClient,因为它推断,您可以在HttpURLConnection中迁移代码https:/

  6. Android HttpClient,DefaultHttpClient,HttpPost

    我如何将字符串数据(JSONObject.toString())发送到URL.我想在util类中编写一个静态方法来执行此操作.我希望方法签名如下publicstaticStringpostData(Stringurl,StringpostData)抛出SomeCustomException字符串url的格式应该是什么返回String是来自服务器的响应,作为json数据的字符串表示.编辑目前的连接工

  7. Android:HTTPClient

    我正在从svn.apache.org尝试http-cleint教程.在运行应用程序时,我在控制台中收到以下错误.我在AndroidManifest.xml中添加了android.permission.INTERNET.HalloAndroid.java中的java代码如下任何帮助深表感谢.解决方法问题解决了.AndroidManifest.xml文件中的这一行导致了麻烦.

  8. android – 同时使用多个AsyncTasks的HttpClient请求

    我正在开发一个需要同时下载多个文件的应用程序.我正在为每个文件创建一个具有自己的HttpClient的AsyncTask,但是下一个文件只有在上一个文件完成后才开始下载.可能是服务器端的问题吗?

  9. OpenFeign实现远程调用

    这篇文章主要为大家详细介绍了OpenFeign实现远程调用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Java 远程调用失败重试的操作方法

    这篇文章主要介绍了Java 远程调用失败重试的操作方法,今天给大家介绍了一下 Spring​ 的 @Retryable 注解使用,并通过几个 demo 来带大家编写了自己重试拦截器以及回滚方法,需要的朋友可以参考下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部