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();
    }
}

  

-----------------------------------------------------------------------------Get请求发送-----------------------------------------------------------------------------

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

    public User resQuest(){
        ResponseEntity<String> 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}";
public Map resQuest() {
        Map map2=new HashMap();
        map2.put("id","aaa");
//      发送请求
        ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class,map2);

-----------------------------------------------------------------------------Post请求发送-----------------------------------------------------------------------------

@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<String> 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;
}

  

---------------------------------------------------------------------带上headers请求头 请求的 方法------------------------------------------------------------

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<String> response2 = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(null, headers),String.class);
        log.info("get with selfDefine header: {}", response2);

------------------------------------------------------------统一加上请求头的写法------------------------------------------------------------

   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<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>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<Header> 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

  

原文地址:https://www.cnblogs.com/kaibindirver/p/15398815.html