springboot -RestTemplate 發送請求


看這個學的

https://www.bilibili.com/video/BV1Zf4y1U7p5?from=search&seid=9719059667753019566&spm_id_from=333.337.0.0

也可以參考下這個(幾種寫法)

https://blog.csdn.net/u012702547/article/details/77917939 

 

請求頭的寫法參考這個

https://zhuanlan.zhihu.com/p/151984334

 

配置文件可以參考這個:

https://www.jianshu.com/p/95680c1eb6e0

 

請求配置文件

 

 

 package com.config;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class Restemconnfig {
    @Autowired
    private RestTemplateBuilder builder;

    @Bean
    public RestTemplate restTemplate(){
        return builder.build();
    }
}

  

上面配置文件也可以這樣寫

@Configuration
public class Restemconnfig {
    @Bean
    @LoadBalanced   //配置負載均衡實現---Ribbon
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

-----------------------------------------------------------------------------Get請求發送-----------------------------------------------------------------------------

 
import org.springframework.web.client.RestTemplate;
    @Autowired
    private RestTemplate restTemplate;

@Service
@Slf4j
public class RequestUrlServer {
    private final String url=  "http://localhost:8280/tool/aaa" ;
    @Autowired
    private RestTemplate restTemplate;

    public User resQuest(){
        ResponseEntity responseEntity =restTemplate.getForEntity(url,String.  class );
        log.info(  "響應: " +responseEntity);
      
//      獲取響應體
        String body = responseEntity.getBody();
        log.info(String.valueOf(body));

//      獲取響應碼
        int Code = responseEntity.getStatusCodeValue();
        log.info(String.valueOf(Code));

//      獲取請求頭
        HttpHeaders Headers = responseEntity.getHeaders();
        log.info(String.valueOf(Headers));
       return null ; 
}

  

  • getForEntity第二個參數String.class表示我希望返回的body類型是String

 

拼接url 發送請求

private final String url = "http://localhost:8280/tool/{id}";
?
1
2
3
4
5
6
<code> public Map resQuest() {
         Map map2= new HashMap();
         map2.put( "id" , "aaa" );
//      發送請求
         ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String. class ,map2);
</code>

 

-----------------------------------------------------------------------------Post請求發送-----------------------------------------------------------------------------

---data的話也是這么傳的 親測ok
map2= "uuu=123" 
 @Service
@Slf4j
public class RequestUrlServer {
    private final String url =  "http://localhost:8380/tool/aaa" ;
    @Autowired
    private RestTemplate restTemplate;

    public Map resQuest() {
      //請求參數
        Map map2= new HashMap();
        map2.put( "name" , "aaa" );
//      發送請求
        ResponseEntity responseEntity = restTemplate.postForEntity(url,map2,String. class );

 

 

------------------------------------------------------------------------返回值處理方法---------------------------------------------------

 //        //第一種取值方法
//        JSONObject jsonObject = JSONObject.parseObject(body);
//        log.info("響應體: " + body);
//        log.info("響應體: " + jsonObject);
//        log.info("響應體: " + jsonObject.get("name"));
//
//        //第二種取值方法
//        Map<string, string=""> map = JSONObject.<map<string, string="">>parseObject(body, Map.class);
//        log.info("響應體1: " + map);
//
////      第三種映射到類里面
//        User user = JSONObject.parseObject(body, User.class);
//        log.info(user.toString());


方法分別 返回類型 Map or User
其中User是根據返回的json 來定義
如響應返回 { "name" : "張三" }

User類為
import lombok.Data;

@Data
public class User {
    private String name;
}
</map<string,></string,>

  

---------------------------------------------------------------------帶上headers請求頭 請求的 方法------------------------------------------------------------

    • 希望復用 HttpHeaders
    • headers.add 方式添加請求頭;而不是前面的 set方式

 

 public class RequestUrlServer {
    private final String url =  "http://localhost:8380/tool/bbb" ;
    private final String url2 =  "http://localhost:8380/tool/aaa" ;
    @Autowired
    private RestTemplate restTemplate;

    public int resQuest() {
        HttpHeaders headers =  new HttpHeaders();
        headers.set( "user-agent" ,
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36" );
        headers.set( "cookie" ,  "my_user_id=haha123; UN=1231923;gr_user_id=welcome_yhh;" );

//        請求bady參數
        Map map2= new HashMap();
        map2.put( "name" , "aaa" );

//        發送post請求帶上heard
        String response = restTemplate.postForObject(url2,  new HttpEntity<>(map2, headers), String. class );
        log.info( "post with selfDefine header: {}" , response);

       
        //發送Get請求帶上heard
        ResponseEntity response2 = restTemplate.exchange(url, HttpMethod.GET,  new HttpEntity<>( null , headers),String. class );
        log.info( "get with selfDefine header: {}" , response2);

 

------------------------------------------------------------統一加上請求頭的寫法------------------------------------------------------------

參考: https://zhuanlan.zhihu.com/p/151984334

    public int resQuest() {

        // 借助攔截器的方式來實現塞統一的請求頭
        ClientHttpRequestInterceptor interceptor = (httpRequest, bytes, execution) -> {
            httpRequest.getHeaders().set( "user-agent" ,
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36" );
            httpRequest.getHeaders().set( "cookie" ,  "my_user_id=haha123; UN=1231923;gr_user_id=interceptor;" );
            return execution.execute(httpRequest, bytes);
        };

//        統一加入請求頭
        restTemplate.getInterceptors().add(interceptor);

//        請求bady參數
        Map map2= new HashMap();
        map2.put( "name" , "aaa" );
//        發送post請求帶上heard
        String response2 = restTemplate.postForObject(url2,map2,String. class );
        log.info( "post with selfDefine header: {}" , response2);

//        get請求
        String response = restTemplate.getForObject(url, String. class );
        log.info( "get with selfDefine header by Interceptor: {}" , response);

 

-------------------------------------------------------------------接口接收請求頭的寫法-------------------------------------------------------------------

 @PostMapping ( "/aaa" )
    public User delete_User3 ( @RequestBody User user, HttpServletRequest HttpServletRequest) {
        log.info(String.valueOf(user));
        log.info(HttpServletRequest.getHeader( "cookie" ));
        return user;
    }

 

 

 

-----------------------------------------------------------------配置文件 參數---------------------------------

 import org.apache.http.client.HttpClient;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
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.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {
   
    /**
     * http連接管理器
     * @return
     */
    @Bean
    public HttpClientConnectionManager poolingHttpClientConnectionManager() {
        /*// 注冊http和https請求
        Registry registry = RegistryBuilder.create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", SSLConnectionSocketFactory.getSocketFactory())
                .build();
        PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(registry);*/
       
        PoolingHttpClientConnectionManager poolingHttpClientConnectionManager =  new PoolingHttpClientConnectionManager();
        // 最大連接數
        poolingHttpClientConnectionManager.setMaxTotal( 500 );
        // 同路由並發數(每個主機的並發)
        poolingHttpClientConnectionManager.setDefaultMaxPerRoute( 100 );
        return poolingHttpClientConnectionManager;
    }
   
    /**
     * HttpClient
     * @param poolingHttpClientConnectionManager
     * @return
     */
    @Bean
    public HttpClient httpClient(HttpClientConnectionManager poolingHttpClientConnectionManager) {
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        // 設置http連接管理器
        httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);
       
        /*// 設置重試次數
        httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true));*/
       
        // 設置默認請求頭
        /*List
headers = new ArrayList<>(); headers.add(new BasicHeader("Connection", "Keep-Alive")); httpClientBuilder.setDefaultHeaders(headers);*/ return httpClientBuilder.build(); } /** * 請求連接池配置 * @param httpClient * @return */ @Bean public ClientHttpRequestFactory clientHttpRequestFactory(HttpClient httpClient) { HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(); // httpClient創建器 clientHttpRequestFactory.setHttpClient(httpClient); // 連接超時時間/毫秒(連接上服務器(握手成功)的時間,超出拋出connect timeout) clientHttpRequestFactory.setConnectTimeout( 5 * 1000 ); // 數據讀取超時時間(socketTimeout)/毫秒(務器返回數據(response)的時間,超過拋出read timeout) clientHttpRequestFactory.setReadTimeout( 10 * 1000 ); // 連接池獲取請求連接的超時時間,不宜過長,必須設置/毫秒(超時間未拿到可用連接,會拋出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool) clientHttpRequestFactory.setConnectionRequestTimeout( 10 * 1000 ); return clientHttpRequestFactory; } /** * rest模板 * @return */ @Bean public RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory) { // boot中可使用RestTemplateBuilder.build創建 RestTemplate restTemplate = new RestTemplate(); // 配置請求工廠 restTemplate.setRequestFactory(clientHttpRequestFactory); return restTemplate; } }

 

 

接口接收請求的看這兒

https://www.cnblogs.com/kaibindirver/p/15524830.html

 

 

 

 

后記:

操作響應的json----    com.alibaba.fastjson   用的是這個庫


    com.alibaba
    fastjson
    1.2.47

  

 

 

 發送請求
        JSONObject response = restTemplate.postForObject(url2,  new HttpEntity<>(data, headers), JSONObject. class );
        log.info( "響應: " + response);
        String s = response.getString( "code" );
        System. out .println(s);

 

如果是返回String類型  (長得像json的string)

 String response = restTemplate.postForObject(url2,  new HttpEntity<>(map2, headers), String. class );

JSONObject  object = JSON.parseObject(response);

  

獲取json 鍵對應的數組

JSONArray jsonArray = data2.getJSONArray("logs");

獲取數組里面對應的 json

for (int i=0;i<jsonArray.size();i++){
  獲取數組里面對應的 json
  HashMap aa= (HashMap) jsonArray.get(i);
獲取json里面對應鍵的值
  String tager= (String) aa.get("content");

------------------------------------判斷字符類型用上  lucaxdata.getClass().getName()

 

13、string轉json格式,獲取里面得到 數組或json格式的值

String targe2="{'aaa':11111,'bbb':[1,2,3,4,5,6]}";

string轉json格式
JSONObject object = JSON.parseObject(targe2);;

獲取json里面的aaaa的值

String object2 = targe2.getString("aaa");

如果哦aaa的值還是json

JSONObject object2 = targe2.getJSONObject("aaa");

獲取json里面的數組

JSONArray object2 = targe2.getJSONArray("bbb");

 

 

 

 

 

這個不錯,可以參考處理請求響應回來的json
https://www.runoob.com/w3cnote/java-json-instro.html 

https://www.cnblogs.com/chushujin/p/11371450.html

 

 

 

后記:

響應是非200請求會拋異常,可以用try去捕獲

見 https://www.cnblogs.com/kaibindirver/p/15948384.html

 

 

傳參數為from表單,用下面方法發送

 MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
        paramMap.add("secToken", "FuVYdeF1");
        paramMap.add("LogStoreName", "production-education");
        paramMap.add("ProjectName", "kuebernetes-production");
        //      發送請求
        JSONObject retul = restTemplate.postForObject(url2, new HttpEntity<>(paramMap, headers), JSONObject.class);
        System.out.println(retul);

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM