首页 > 其他分享 >RestTemplate和 apache HttpClient 使用方式

RestTemplate和 apache HttpClient 使用方式

时间:2024-07-28 10:50:12浏览次数:13  
标签:restTemplate RestTemplate public Bean apache new response HttpClient

一、RestTemplate 

RestTemplate 是简化了组装请求对象 该类存在于 依赖 spring-boot-starter-web中,RestTemplate 支持get,post 现 1、RestTemplate 不是可直接注入Bean, 需要实例化生成Bean Spring Boot 的自动配置机制非常强大,但并不是所有的类都被默认自动配置为 bean。对于 RestTemplate 来说,Spring Boot 并没有默认自动配置一个 RestTemplate bean,主要原因有以下几点:   1)、多样化的配置需求   2)、鼓励显式配置   3)、灵活性和扩展性:显式配置使得应用更加灵活,可以根据需要创建和配置多个不同的
1、简单方式生成Bean
@Configuration
public class AppConfig {
   @Bean
   public RestTemplate restTemplate() {         
      return new RestTemplate();    
    } 
  }
  
  2、自定义参数 生成Bean
  
  @Configuration
public class RestTemplateAutoConfiguration {
    private final RestTemplateBuilder builder;

    public RestTemplateAutoConfiguration(RestTemplateBuilder builder) {
        this.builder = builder;
    }

    @Bean
    public RestTemplate restTemplate() {
        return builder
                .setConnectTimeout(Duration.ofSeconds(3))
                .setReadTimeout(Duration.ofMillis(PushTaskConstant.DEFAULT_REQUEST_TIME))
                .requestFactory(() -> new HttpComponentsClientHttpRequestFactory(
                        HttpClientBuilder.create()
                                .setMaxConnTotal(200)
                                .setMaxConnPerRoute(40)
                                .disableAutomaticRetries()
                                .useSystemProperties().build())
                ).build();
    }
}

2、在重点介绍post请求试

   1)请求 当请求类型contentType是MediaType.APPLICATION_FORM_URLENCODED

  

1、请求方法

@Resource
RestTemplate restTemplate;

@Test
public  void  testRequest(){
  
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
    // 当请求类型contentType是MediaType.APPLICATION_FORM_URLENCODED,请求参数实体必须是MultiValueMap
    MultiValueMap<String,String> requestBody=new LinkedMultiValueMap<>();
    requestBody.add("userName","testregisterName");
    requestBody.add("loginNo","testReg");
    requestBody.add("contactPhone","15210212542");
    requestBody.add("smsCode","3820");
    // 请求和header组合用entity   
    HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(requestBody, headers);

    ResponseEntity response= restTemplate.postForEntity("http://testapi-xxxx.com/openApp/user/registerUser", entity, String.class);
    System.out.println("response.getStatusCode() = " + response.getStatusCode());
    System.out.println("response.getBody() = " + response.getBody());

}

2、接收方法

public ResultEntity<String> registerUser(RegisterUserRequest userRequest) {
}
2)当请求类型contentType是MediaType.APPLICATION_JSON
 @Resource
    RestTemplate restTemplate;
    
  @Test
    public  void  testRequest2(){
        RestTemplate restTemplate = new RestTemplate();
        headers.setContentType(MediaType.APPLICATION_JSON);
        // 当contentType 是APPLICATION_JSON  请求参数对象用map
        Map<String,String> requestEntity=new HashMap<>();
        requestEntity.put("userName","testregisterName");
        requestEntity.put("loginNo","testReg");
        requestEntity.put("contactPhone","15210212542");
        requestEntity.put("smsCode","3820");
         // 请求和header组合用entity   
        HttpEntity<Map<String, String>> entity = new HttpEntity<>(requestEntity, headers);
        ResponseEntity response= restTemplate.postForEntity("http://testapi-console.dmall.com/openApp/user/registerUser", entity, String.class);
        System.out.println("response.getStatusCode() = " + response.getStatusCode());
        System.out.println("response.getBody() = " + response.getBody());


    }
ps:已有Bean的注入
1、第一种在配置类中 可以以参数注入
@Configuration
public class AppConfig {

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder
                .setConnectTimeout(Duration.ofMillis(5000))
                .setReadTimeout(Duration.ofMillis(5000))
                .build();
    }
    
   -___________________________-
   2、也可以正常以属性注入
 @Configuration
public class AppConfig {

    @Resource
    private RestTemplateBuilder builder;

    @Bean
    public RestTemplate restTemplate() {
        return builder
                .setConnectTimeout(Duration.ofMillis(5000))
                .setReadTimeout(Duration.ofMillis(5000))
                .build();
    }
} 
二、 java 8 HttpClient Apache HttpClient 适合需要更多配置和功能的场景
// 需要引入依赖
 <dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

  实例调用  ps: 使用  httpClient 需要显示关闭或 try(){} ,try-with-resources 释放  

@Test
    public void testHttp()  throws Exception{
        try(CloseableHttpClient httpClient= HttpClients.createDefault()){
            HttpPost httpPost=new HttpPost("http://testapi-console.dmall.com/openApp/user/registerUser");
            // 可以自定义进行设置
//            HttpClients.custom().build()
//            HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {
//                @Override
//                public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
//                    if (executionCount >= 3) {
//                        return false; // 超过最大重试次数
//                    }
//                    if (exception instanceof org.apache.http.NoHttpResponseException) {
//                        return true; // 服务器无响应
//                    }
//                    if (exception instanceof java.net.SocketTimeoutException) {
//                        return true; // 超时
//                    }
//                    return false; // 不重试其他类型的异常
//                }
//            };

            // 可以自定义进行配置信息
            RequestConfig requestConfig=RequestConfig.custom()
                    .setConnectTimeout(5000)
                    .setSocketTimeout(5000)
                    .build();
            httpPost.setConfig(requestConfig);
            Map<String,String> parameters=new HashMap<>();
            parameters.put("userName","testregisterName");
            parameters.put("loginNo","testReg");
            parameters.put("contactPhone","15210212542");
            parameters.put("smsCode","3820");
             StringJoiner stringJoiner=new StringJoiner("&");
             for(Map.Entry entry:parameters.entrySet()){
                 stringJoiner.add(URLEncoder.encode(entry.getKey().toString(),"UTF-8")+"="+URLEncoder.encode(entry.getValue().toString(),"UTF-8"));
             }
             
//            httpPost.setHeader("Content-Type","application/x-www-form-urlencoded");
//            httpPost.setEntity(new StringEntity(stringJoiner.toString()));
            httpPost.setHeader("Content-Type",MediaType.APPLICATION_JSON_VALUE);
            httpPost.setEntity(new StringEntity(JSON.toJSONString(parameters)));

            HttpResponse response=httpClient.execute(httpPost);
            System.out.println("response.getEntity().getContent().toString() = " + response.getEntity().getContent().toString());
            String readStr="";
            StringBuilder sb=new StringBuilder();
            try(BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(response.getEntity().getContent()))){
                while ((readStr=bufferedReader.readLine())!=null){
                    sb.append(readStr);
                }
            }
            System.out.println("stringJoiner = " + sb.toString());
            
        }catch (Exception e){
            e.printStackTrace();
            throw  e;
        }
    }

 

 

 

 

标签:restTemplate,RestTemplate,public,Bean,apache,new,response,HttpClient
From: https://www.cnblogs.com/liyanbofly/p/18327957

相关文章

  • Windows下使用Apache和mod_wsgi部署django项目
    一、安装Python确定好所需要的python版本。二、安装Apacheapache下载地址:http://httpd.apache.org/docs/current/platform/windows.html#down下载完成后做如下操作将apache解压后直接复制到你想安装的路径下1、更改httpd.conf文件,找到如下代码并更改路径DefineSRVROOT"E:......
  • 【Apache Doris】3.0存算分离|标准部署篇(一)
    【ApacheDoris】3.0存算分离|标准部署篇(一)一、前提概要二、环境信息三、前置准备四、FoundationDB安装五、OpenJDK17安装六、MetaService安装七、集群安装八、快速体验接上数据架构新篇章:存算一体与存算分离的协同演进。本文主要分享ApacheDoris3.0存算分离架......
  • Apache2服务介绍
    apache2安装使用配置web访问配置虚拟主机配置代理正向代理反向代理官网互联网上排名第一的HTTP服务器,ApacheHTTP服务器项目致力于开发和维护适用于现代操作系统(包括UNIX和Windows)的开源HTTP服务器。该项目的目标是提供安全、高效且可扩展的服务器,该服务......
  • 在.net 8中使用HttpClientFactory时日志记录请求body和响应body
     1、定义DelegatingHandlerpublicclassLoggingHandler:DelegatingHandler{privatereadonlyILogger<LoggingHandler>_logger;publicLoggingHandler(ILogger<LoggingHandler>logger){_logger=logger;}protectedov......
  • Linux中,Apache配置与应用
    ApacheHTTPServer之所以受到众多企业的青睐,得益于其代码开源、跨平台、功能模块化、可灵活定制等诸多优点,不仅性能稳定,在安全性方面的表现也十分出色。Apache连接保持HTTP是属于应用层的面向对象协议,基于TCP协议之上的可靠传输。每次在进行HTTP连接之前,需要先进行TCP连......
  • 使用CloseableHttpClient 访问 http 和https 的get请求
    publicclassHttpClientUtil{privatestaticLoggerlogger=LoggerFactory.getLogger(HttpClientUtil.class);/***带参数的get请求**@paramurl*@paramparam*@returnString*/publicstaticStringdoGet(Stringurl,Map<S......
  • 使用Apache Camel进行Java企业集成
    使用ApacheCamel进行Java企业集成大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!本文将介绍如何使用ApacheCamel进行Java企业集成,帮助您在企业应用中实现高效的数据交换和流程自动化。一、ApacheCamel简介ApacheCamel是一个强大的开源集成框架,它提......
  • 无法解析插件 org.apache.maven.plugins:maven-war-plugin:3.2.3(已解决)
    文章目录1、问题出现的背景2、解决方法1、问题出现的背景最开始我想把springboot项目转为javaweb项目,然后我点击下面这个插件就转为javaweb项目了,但是我后悔了,想要还原成springboot项目,点开项目结构关于web的都移除了,还是不行,控制台报下面的错误无法解析插件org.......
  • Apache Doris + Paimon 快速搭建指南|Lakehouse 使用手册(二)
    湖仓一体(DataLakehouse)融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势,帮助用户更加便捷地满足各种数据处理分析的需求。在过去多个版本中,ApacheDoris持续加深与数据湖的融合,已演进出一套成熟的湖仓一体解决方案。为便于用户快速入门,我们将通过系列文......
  • 整合Apache Hudi+Mysql+FlinkCDC2.1+CDH6.3.0
    一、环境准备1.环境准备:flink1.13.1+hudi0.10+hive2.1.1+cdh6.3.0+mysql5.7+flinkcdc2.1+flinkweb平台二.编译hudi(这个编译是以前的一个测试版本,编译大同小异)1.使用git命令下载hudi0.10的代码steven@wangyuxiangdeMacBook-Pro~gitclonehttps://github.com/ap......