激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - Java教程 - java使用RestTemplate封裝post請求方式

java使用RestTemplate封裝post請求方式

2022-03-06 00:47小碼哥(^_^) Java教程

這篇文章主要介紹了java使用RestTemplate封裝post請求方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

使用RestTemplate封裝post請求

之前筆者寫過一篇比較實用的文章 java使用httpclient封裝post請求和get的請求,其實java中實現http請求還可以用 RestTemplate 完成,下面給出示例代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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原生的

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 添加消息轉換器
   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

(設置頭信息的時候回使用到)

?
1
2
3
4
5
6
7
8
9
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、常用的方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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<>();

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/qq9808/article/details/105647182

延伸 · 閱讀

精彩推薦
1042
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 国产无遮挡裸体免费视频 | 中国免费一级毛片 | 国产精品久久久久久久久久久久午夜 | 一级毛片免费一级 | 在线成人精品视频 | 成人aaaa免费全部观看 | 亚洲欧美一区二区三区在线观看 | 在线观看国产www | 久草最新网址 | 国产成人高清成人av片在线看 | 91精品国产综合久久久动漫日韩 | asian裸体佳人pics | 亚洲成人福利 | 2019亚洲日韩新视频 | 国产一级做a爱片在线看免 日日草夜夜 | 国产一区二区三区四区精 | 草b视频在线观看 | 欧美成人免费一区二区三区 | 美女在线观看视频一区二区 | 一区二区高清视频在线观看 | 国产日韩精品欧美一区视频 | 久久99免费观看 | 国产毛片在线看 | 黄色免费电影网址 | 91超在线 | 一区二区三区日韩在线观看 | 欧美成人se01短视频在线看 | 黄色欧美精品 | 草莓福利视频在线观看 | 国产羞羞视频在线观看 | 国产精品久久久久久模特 | 免费一级毛片在线播放视频老 | 亚洲特黄 | 一级黄色大片在线观看 | 免费国产在线观看 | 国产羞羞网站 | 久久777国产线看观看精品 | 久久久久一区二区三区四区五区 | 一区二区精品视频 | 美女av在线免费观看 | 91精品国产综合久久久动漫日韩 |