千家信息网

springboot中RestTemplate和okhttp以及HttpClient对比的示例分析

发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,springboot中RestTemplate和okhttp以及HttpClient对比的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学
千家信息网最后更新 2025年11月13日springboot中RestTemplate和okhttp以及HttpClient对比的示例分析

springboot中RestTemplate和okhttp以及HttpClient对比的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1、HttpClient:代码复杂,还得操心资源回收等。代码很复杂,冗余代码多,不建议直接使用。

2、RestTemplate: 是 Spring 提供的用于访问Rest服务的客户端, RestTemplate 提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。

引入jar包:

              org.springframework.boot            spring-boot-starter-web        

添加初始化配置(也可以不配,有默认的)--注意RestTemplate只有初始化配置,没有什么连接池

package com.itunion.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.client.ClientHttpRequestFactory;import org.springframework.http.client.SimpleClientHttpRequestFactory;import org.springframework.web.client.RestTemplate;@Configurationpublic class ApiConfig {    @Bean    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {        return new RestTemplate(factory);    }    @Bean    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();//默认的是JDK提供http连接,需要的话可以//通过setRequestFactory方法替换为例如Apache HttpComponents、Netty或//OkHttp等其它HTTP library。        factory.setReadTimeout(5000);//单位为ms        factory.setConnectTimeout(5000);//单位为ms        return factory;    }}

  1)get请求(不带参的即把参数取消即可)

// 1-getForObject()User user1 = this.restTemplate.getForObject(uri, User.class);// 2-getForEntity()ResponseEntity responseEntity1 = this.restTemplate.getForEntity(uri, User.class);HttpStatus statusCode = responseEntity1.getStatusCode();HttpHeaders header = responseEntity1.getHeaders();User user2 = responseEntity1.getBody();  // 3-exchange()RequestEntity requestEntity = RequestEntity.get(new URI(uri)).build();ResponseEntity responseEntity2 = this.restTemplate.exchange(requestEntity, User.class);User user3 = responseEntity2.getBody();

    方式一:

Notice notice = restTemplate.getForObject("http://fantj.top/notice/list/{1}/{2}"                , Notice.class,1,5);

    方式二:

Map map = new HashMap();        map.put("start","1");        map.put("page","5");        Notice notice = restTemplate.getForObject("http://fantj.top/notice/list/"                , Notice.class,map);

  2)post请求:

// 1-postForObject()User user1 = this.restTemplate.postForObject(uri, user, User.class);// 2-postForEntity()ResponseEntity responseEntity1 = this.restTemplate.postForEntity(uri, user, User.class);// 3-exchange()RequestEntity requestEntity = RequestEntity.post(new URI(uri)).body(user);ResponseEntity responseEntity2 = this.restTemplate.exchange(requestEntity, User.class);

  方式一:

String url = "http://demo/api/book/";        HttpHeaders headers = new HttpHeaders();        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");        headers.setContentType(type);        String requestJson = "{...}";        HttpEntity entity = new HttpEntity(requestJson,headers);        String result = restTemplate.postForObject(url, entity, String.class);        System.out.println(result);

  方式二:

@Testpublic void rtPostObject(){    RestTemplate restTemplate = new RestTemplate();    String url = "http://47.xxx.xxx.96/register/checkEmail";    HttpHeaders headers = new HttpHeaders();    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);    MultiValueMap map= new LinkedMultiValueMap<>();    map.add("email", "844072586@qq.com");     HttpEntity> request = new HttpEntity<>(map, headers);    ResponseEntity response = restTemplate.postForEntity( url, request , String.class );    System.out.println(response.getBody());}

其它:还支持上传和下载功能;

3、okhttp:OkHttp是一个高效的HTTP客户端,允许所有同一个主机地址的请求共享同一个socket连接;连接池减少请求延时;透明的GZIP压缩减少响应数据的大小;缓存响应内容,避免一些完全重复的请求

当网络出现问题的时候OkHttp依然坚守自己的职责,它会自动恢复一般的连接问题,如果你的服务有多个IP地址,当第一个IP请求失败时,OkHttp会交替尝试你配置的其他IP,OkHttp使用现代TLS技术(SNI, ALPN)初始化新的连接,当握手失败时会回退到TLS 1.0。

1)使用:它的请求/响应 API 使用构造器模式builders来设计,它支持阻塞式的同步请求和带回调的异步请求。

引入jar包:

    com.squareup.okhttp3    okhttp    3.10.0

2)配置文件:

import okhttp3.ConnectionPool;import okhttp3.OkHttpClient;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSocketFactory;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import java.security.KeyManagementException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import java.util.concurrent.TimeUnit;@Configurationpublic class OkHttpConfiguration {    @Bean    public OkHttpClient okHttpClient() {        return new OkHttpClient.Builder()                //.sslSocketFactory(sslSocketFactory(), x509TrustManager())                .retryOnConnectionFailure(false)                .connectionPool(pool())                .connectTimeout(30, TimeUnit.SECONDS)                .readTimeout(30, TimeUnit.SECONDS)                .writeTimeout(30,TimeUnit.SECONDS)                .build();    }    @Bean    public X509TrustManager x509TrustManager() {        return new X509TrustManager() {            @Override            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {            }            @Override            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {            }            @Override            public X509Certificate[] getAcceptedIssuers() {                return new X509Certificate[0];            }        };    }    @Bean    public SSLSocketFactory sslSocketFactory() {        try {            //信任任何链接            SSLContext sslContext = SSLContext.getInstance("TLS");            sslContext.init(null, new TrustManager[]{x509TrustManager()}, new SecureRandom());            return sslContext.getSocketFactory();        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (KeyManagementException e) {            e.printStackTrace();        }        return null;    }    /**     * Create a new connection pool with tuning parameters appropriate for a single-user application.     * The tuning parameters in this pool are subject to change in future OkHttp releases. Currently     */    @Bean    public ConnectionPool pool() {        return new ConnectionPool(200, 5, TimeUnit.MINUTES);    }}

3)util工具:

import okhttp3.*;import org.apache.commons.lang3.exception.ExceptionUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.File;import java.util.Iterator;import java.util.Map;public class OkHttpUtil{    private static final Logger logger = LoggerFactory.getLogger(OkHttpUtil.class);        private static OkHttpClient  okHttpClient;    @Autowired    public OkHttpUtil(OkHttpClient  okHttpClient) {        OkHttpUtil.okHttpClient= okHttpClient;    }         /**     * get     * @param url     请求的url     * @param queries 请求的参数,在浏览器?后面的数据,没有可以传null     * @return     */    public static  String get(String url, Map queries) {        String responseBody = "";        StringBuffer sb = new StringBuffer(url);        if (queries != null && queries.keySet().size() > 0) {            boolean firstFlag = true;            Iterator iterator = queries.entrySet().iterator();            while (iterator.hasNext()) {                Map.Entry entry = (Map.Entry) iterator.next();                if (firstFlag) {                    sb.append("?" + entry.getKey() + "=" + entry.getValue());                    firstFlag = false;                } else {                    sb.append("&" + entry.getKey() + "=" + entry.getValue());                }            }        }        Request request = new Request.Builder()                .url(sb.toString())                .build();        Response response = null;        try {             response = okHttpClient.newCall(request).execute();            int status = response.code();            if (response.isSuccessful()) {                return response.body().string();            }        } catch (Exception e) {            logger.error("okhttp3 put error >> ex = {}", ExceptionUtils.getStackTrace(e));        } finally {            if (response != null) {                response.close();            }        }        return responseBody;    }    /**     * post     *     * @param url    请求的url     * @param params post form 提交的参数     * @return     */    public static String post(String url, Map params) {        String responseBody = "";        FormBody.Builder builder = new FormBody.Builder();        //添加参数        if (params != null && params.keySet().size() > 0) {            for (String key : params.keySet()) {                builder.add(key, params.get(key));            }        }        Request request = new Request.Builder()                .url(url)                .post(builder.build())                .build();        Response response = null;        try {             response = okHttpClient.newCall(request).execute();            int status = response.code();            if (response.isSuccessful()) {                return response.body().string();            }        } catch (Exception e) {            logger.error("okhttp3 post error >> ex = {}", ExceptionUtils.getStackTrace(e));        } finally {            if (response != null) {                response.close();            }        }        return responseBody;    }    /**     * get     * @param url     请求的url     * @param queries 请求的参数,在浏览器?后面的数据,没有可以传null     * @return     */    public static String getForHeader(String url, Map queries) {        String responseBody = "";        StringBuffer sb = new StringBuffer(url);        if (queries != null && queries.keySet().size() > 0) {            boolean firstFlag = true;            Iterator iterator = queries.entrySet().iterator();            while (iterator.hasNext()) {                Map.Entry entry = (Map.Entry) iterator.next();                if (firstFlag) {                    sb.append("?" + entry.getKey() + "=" + entry.getValue());                    firstFlag = false;                } else {                    sb.append("&" + entry.getKey() + "=" + entry.getValue());                }            }        }        Request request = new Request.Builder()                .addHeader("key", "value")                .url(sb.toString())                .build();        Response response = null;        try {             response = okHttpClient.newCall(request).execute();            int status = response.code();            if (response.isSuccessful()) {                return response.body().string();            }        } catch (Exception e) {            logger.error("okhttp3 put error >> ex = {}", ExceptionUtils.getStackTrace(e));        } finally {            if (response != null) {                response.close();            }        }        return responseBody;    }    /**     * Post请求发送JSON数据....{"name":"zhangsan","pwd":"123456"}     * 参数一:请求Url     * 参数二:请求的JSON     * 参数三:请求回调     */    public static String postJsonParams(String url, String jsonParams) {        String responseBody = "";        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonParams);        Request request = new Request.Builder()                .url(url)                .post(requestBody)                .build();        Response response = null;        try {             response = okHttpClient.newCall(request).execute();            int status = response.code();            if (response.isSuccessful()) {                return response.body().string();            }        } catch (Exception e) {            logger.error("okhttp3 post error >> ex = {}", ExceptionUtils.getStackTrace(e));        } finally {            if (response != null) {                response.close();            }        }        return responseBody;    }    /**     * Post请求发送xml数据....     * 参数一:请求Url     * 参数二:请求的xmlString     * 参数三:请求回调     */    public static String postXmlParams(String url, String xml) {        String responseBody = "";        RequestBody requestBody = RequestBody.create(MediaType.parse("application/xml; charset=utf-8"), xml);        Request request = new Request.Builder()                .url(url)                .post(requestBody)                .build();        Response response = null;        try {             response = okHttpClient.newCall(request).execute();            int status = response.code();            if (response.isSuccessful()) {                return response.body().string();            }        } catch (Exception e) {            logger.error("okhttp3 post error >> ex = {}", ExceptionUtils.getStackTrace(e));        } finally {            if (response != null) {                response.close();            }        }        return responseBody;    }}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

参数 数据 方式 配置 代码 客户 支持 服务 复杂 内容 单位 地址 客户端 方法 浏览器 问题 帮助 浏览 示例 不配 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 2k20服务器连不上怎么玩 率土之滨s1服务器查询 易语言数据库写入的信息不见了 有什么可以做网络安全宣传的活动 数据库最基本检索技术 服务器vmfs怎么设置 某一学生所在班级成绩数据库 数据库连接的过程 下周网络安全有啥事件 抚州市瑄楷网络技术有限公司 辽宁省英雄联盟服务器云主机 审计专业学数据库 高校知网数据库价格 北京通用软件开发配置 智能停车场管理系统软件开发 深圳人脉通网络技术有限公司 危害网络安全 拘留 服务器多网口 xp系统ftp服务器搭建 厦门市公安局网络安全支队张 加强全社会网络安全教育意识培训 外挂服务器逃跑吧少年 文科生能报软件开发吗 三种电子图书数据库 如何查询数据库类型 医周数据库连接失败 软件开发公司都有些什么岗位 浙江pdu服务器电源直销 联影医疗软件开发怎么样 用于数据库安全管理办法
0