欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java使用RestTemplate封装post请求方式

程序员文章站 2022-03-02 21:24:50
目录使用resttemplate封装post请求resttemplate使用封装1、springboot使用resttemplate(使用apache的httpclient)2、使用jdk原生的2、拦...

使用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<>();

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