RestTemplate简介

RestTemplate对HTTP请求进行了封装,进行请求的时候可以保留cookie,在下次请求的时候使用;

postForEntity与postForObject功能类似,可以从源码上面看出postForEntity进行了为空判断;

如果想在GET请求的时候带上cookie,不能使用getForEntity方法,需要使用exchange方法;

注意GET请求参数添加有两种方法:直接添加到URL或者构建MultiValueMap对象;

代码示例

import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import java.util.List;


public class RestRequest {
    public static void main(String[] args) {
        List<String> cookies = login();

        postForValue(cookies);

        jsonPost(cookies);

        getForValue(cookies);

        getForValueV2(cookies);
    }

    // 有些服务器参数需要带在url上面
    private static void getForValueV2(List<String> cookies) {
        RestTemplate restTemplate = new RestTemplate();
        String url = "http://ip:port/xxx?key=value";
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.put(HttpHeaders.COOKIE, cookies);
        HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(null, httpHeaders);
        ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);
        String body = responseEntity.getBody();
        System.out.println(body);
    }

    // 带cookie的Get请求;
    private static void getForValue(List<String> cookies) {
        RestTemplate restTemplate = new RestTemplate();
        String url = "http://ip:port/xxx";
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("key", "value");
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.put(HttpHeaders.COOKIE, cookies);
        HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(params, httpHeaders);
        ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);
        String body = responseEntity.getBody();
        System.out.println(body);
    }

    // json提交请求,带登陆cookie
    private static void jsonPost(List<String> cookies) {
        RestTemplate restTemplate = new RestTemplate();
        String url = "http://ip:port/xxx";
        String jsonString = "{}"; // json字符串,可以嵌套多级
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.put(HttpHeaders.COOKIE, cookies);
        MediaType mediaType = MediaType.parseMediaType("application/json;charset=UTF-8");
        httpHeaders.setContentType(mediaType);
        httpHeaders.add("Accept", MediaType.APPLICATION_JSON.toString());
        HttpEntity<String> httpEntity = new HttpEntity<>(jsonString, httpHeaders);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, httpEntity, String.class);
        String body = responseEntity.getBody();
        System.out.println(body);
    }

    // post提交请求,带登陆cookie
    private static void postForValue(List<String> cookies) {
        RestTemplate restTemplate = new RestTemplate();
        String url = "http://ip:port/xxx";
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("key", "value");
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.put(HttpHeaders.COOKIE, cookies);
        HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(params, httpHeaders);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, httpEntity, String.class);
        String body = responseEntity.getBody();
        System.out.println(body);
    }

    // 登陆请求,请求之后把cookie保留下来
    private static List<String> login() {
        RestTemplate restTemplate = new RestTemplate();
        String url = "http://ip:port/xxx";
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("key", "value");
        HttpHeaders httpHeaders = new HttpHeaders();
        HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(params, httpHeaders);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, httpEntity, String.class);
        HttpHeaders headers = responseEntity.getHeaders();
        return headers.get("Set-Cookie");
    }
}