java使用RestTemplate封装post请求方式

 更新时间:2021年10月29日 08:53:58   作者:小码哥(^_^)  
这篇文章主要介绍了java使用RestTemplate封装post请求方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用RestTemplate封装post请求

之前笔者写过一篇比较实用的文章 java使用httpclient封装post请求和get的请求,其实java中实现http请求还可以用 RestTemplate 完成,下面给出示例代码:

import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.*;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import javax.annotation.PostConstruct;
import java.nio.charset.Charset;
public class HttpHelper {
    private static Logger logger = LoggerFactory.getLogger(HttpHelper.class);
    private RestTemplate restTemplate;
    private HttpHeaders httpHeaders;
    @PostConstruct
    public void init() {
        restTemplate = new RestTemplate();
        restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
        httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(org.springframework.http.MediaType.APPLICATION_JSON);
    }
    /**
     * post - json
     * @param params
     * @return
     */
    public String post(JSONObject params, String url) {
        logger.info("请求参数:{}", params.toJSONString());
        ResponseEntity<String> response;
        try {
            response = restTemplate.exchange(
                    url,
                    HttpMethod.POST,
                    new HttpEntity<>(params, httpHeaders),
                    String.class);
        } catch (Exception e) {
            logger.error("请求异常", e);
            return "请求异常";
        }
        logger.info("响应结果:{}", JSONObject.toJSONString(response));
        if (response.getStatusCode().equals(HttpStatus.OK)) {
            logger.info("请求成功,返回结果:{}", response.getBody());
            return response.getBody();
        }
        logger.error("请求失败,Http状态码:{},返回结果:{}", response.getStatusCode(), response.getBody());
        return response.getBody();
    }
}

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

RestTemplate使用封装

之前接口调用习惯性使用HttpClient,代码复杂,冗余代码多,关心资源回收用起来不是很爽。

RestTemplate默认依赖jdk的HTTP连接工具。也可以 通过setRequestFactory属性切换到不同的HTTP源,比如Apache HttpComponents、Netty、OkHttp。

1、SpringBoot使用RestTemplate(使用apache的httpclient)

import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.ByteArrayHttpMessageConverter;
import org.springframework.http.converter.FormHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.ResourceHttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@Configuration
public class RestTemplateConfig  {
    @Bean
    public RestTemplate getRestTemplate() {
        //手动指定转换器(HttpMessageConverter)
        List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
        messageConverters.add(new ByteArrayHttpMessageConverter());
        messageConverters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));//string强制使用UTF-8
        messageConverters.add(new ResourceHttpMessageConverter());
        messageConverters.add(new AllEncompassingFormHttpMessageConverter());
        messageConverters.add(new FormHttpMessageConverter());
        MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter();
        jacksonConverter.getObjectMapper().setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        messageConverters.add(jacksonConverter);
        RestTemplate restTemplate = new RestTemplateBuilder().additionalMessageConverters(messageConverters).build();
        restTemplate.setRequestFactory(getClientHttpRequestFactory());
        return restTemplate;
    }
    @Bean
    public ClientHttpRequestFactory getClientHttpRequestFactory() {
        // 保持长连接配置,需要在头添加Keep-Alive
        final ConnectionKeepAliveStrategy myStrategy = new ConnectionKeepAliveStrategy() {
            @Override
            public long getKeepAliveDuration(org.apache.http.HttpResponse response, HttpContext context) {
                // 设置一个链接的最大存活时间
                return 5 * 1000L;
            }
        };
        PoolingHttpClientConnectionManager pollingConnectionManager = new PoolingHttpClientConnectionManager(30, TimeUnit.SECONDS);
        pollingConnectionManager.setMaxTotal(2000);//最大连接数
        pollingConnectionManager.setDefaultMaxPerRoute(200);//同路由的最大连接数       
        CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().setConnectionManager(pollingConnectionManager).setKeepAliveStrategy(myStrategy).build();
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(closeableHttpClient);
        factory.setConnectTimeout(3000);
        factory.setReadTimeout(5000);
        return factory;
    }
}

2、使用jdk原生的

// 添加消息转换器
   List messageConverters = new ArrayList();
   messageConverters.add(new StringHttpMessageConverter());
   messageConverters.add(new MappingJackson2HttpMessageConverter());
   //如果useJ2SEHttp申明为true,则使用JDK自带的HttpURLConnection
   SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
   requestFactory.setReadTimeout(3000);
   requestFactory.setConnectTimeout(3000);
   restTemplate = new RestTemplate(requestFactory);
   restTemplate.setMessageConverters(messageConverters);
   //这里是添加了拦截器
   List<ClientHttpRequestInterceptor> interceptorList = new ArrayList<ClientHttpRequestInterceptor>();
   interceptorList.add(new RequestInteceptor());
   restTemplate.setInterceptors(interceptorList);

2、拦截器实现ClientHttpRequestInterceptor

(设置头信息的时候回使用到)

public class RequestInteceptor implements ClientHttpRequestInterceptor {
    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        request.getHeaders().setAll(AppMetadataUtil.getAPP_METADATA());
        String traceId = UUID.randomUUID().toString().replaceAll("-", "");
        request.getHeaders().set("TraceId", traceId.toString());
        return execution.execute(request, body);
    }
}

4、常用的方法

 String url = queryInfo?userId={userId}&pageIndex={pageIndex}&pageSize={pageSize}";
 HashMap<String,Object> parameterMap = new HashMap<String,Object>();
 parameterMap.put("userId", userId);
 parameterMap.put("pageIndex", pageIndex);
 parameterMap.put("pageSize", pageSize);
    String str = restTemplate.getForObject(url, String.class, parameterMap);    
    String result = restTemp.getForObject(requestUrl.toString(), String.class);
    //post
 String url = "http://www.xxx.com/queryInfo"
 String str = restTemplate.postForObject(url, parameterMap, String.class);
   //exchange 设置请求头
    HttpHeaders headers = new HttpHeaders();
 headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8"));
 headers.add("Accept", "application/json;charset=UTF-8");
 HttpEntity<String> httpEntity = new HttpEntity<String>("", headers);
 RestTemplate restTemplate = RestTemplateUtils.getInstance().getRestTemplate();
 ResponseEntity<String> exchange = restTemplate.exchange(retailOrderUrl, HttpMethod.GET, httpEntity, String.class);
 String forObject = exchange.getBody();
    MultiValueMap<String, Object> requestEntity = new LinkedMultiValueMap<>();

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringIOC容器Bean的作用域及生命周期实例

    SpringIOC容器Bean的作用域及生命周期实例

    这篇文章主要为大家介绍了SpringIOC容器Bean的作用域及生命周期实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • apllo开源分布式配置中心详解

    apllo开源分布式配置中心详解

    这篇文章主要为大家介绍了apllo开源分布式配置中心部署详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • javaWeb 四大域对象详细介绍

    javaWeb 四大域对象详细介绍

    这篇文章主要介绍了javaWeb 四大域对象详细介绍的相关资料,需要的朋友可以参考下
    2016-11-11
  • Java中的通用路径转义符介绍

    Java中的通用路径转义符介绍

    这篇文章主要介绍了Java中的通用路径转义符介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Java日常练习题,每天进步一点点(48)

    Java日常练习题,每天进步一点点(48)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-08-08
  • mybatis plus代码生成器配置过程解析

    mybatis plus代码生成器配置过程解析

    这篇文章主要介绍了mybatis plus代码生成器配置过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java 输入流中的read(byte[] b)方法详解

    Java 输入流中的read(byte[] b)方法详解

    这篇文章主要介绍了Java 输入流中的read(byte[] b)方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Java并发编程之代码实现两玩家交换装备

    Java并发编程之代码实现两玩家交换装备

    这篇文章主要介绍了Java并发编程之代码实现两玩家交换装备,文中有非常详细的代码示例,对正在学习java的小伙伴们有一定的帮助,需要的朋友可以参考下
    2021-09-09
  • 了解JAVA Future类

    了解JAVA Future类

    Future是并发编程中的一种设计模式,Future它代表一个异步计算的结果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面小编和大家来一起学习一下吧
    2019-06-06
  • 详解SPI在Dubbo中的应用

    详解SPI在Dubbo中的应用

    通过本文的学习,可以了解 Dubbo SPI 的特性及实现原理,希望对大家的开发设计有一定的启发性
    2021-06-06

最新评论