天天看點

springBoot RestTemplate的http請求一get簡單的無參請求get請求網頁源碼及中文亂碼問題get帶參請求(分為兩類)post請求以此類推postForLocationput請求delete請求

目錄

get簡單的無參請求

發送get無參請求

接收端

測試結果

get請求網頁源碼及中文亂碼問題

get 擷取百度網頁源碼

中文亂碼的解決

get帶參請求(分為兩類)

第一類getForEntity(主要有兩種方式)

第一種

第二種

其他方法

自定義傳回類型

第二類getForObject

post請求以此類推

postForLocation

put請求

delete請求

get簡單的無參請求

發送get無參請求

public static void main(String[] args) throws Exception {
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://127.0.0.1:8080/httpByGetParams", String.class);
        System.out.println("responseEntity.getBody():" + responseEntity.getBody());
        System.out.println("responseEntity.getStatusCode() " + responseEntity.getStatusCode());
        System.out.println("responseEntity.getStatusCodeValue() " + responseEntity.getStatusCodeValue());
        System.out.println("responseEntity.getHeaders() " + responseEntity.getHeaders());
    }

           

接收端

@GetMapping("httpByGetParams")
    public String httpByGetParams(HttpServletRequest request){
        Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String parameterName = parameterNames.nextElement();
            System.out.println(parameterName + "===" + request.getParameter(parameterName));
            //System.out.println(parameterNames.nextElement()+"=="+request.getParameter(parameterNames.nextElement()));
        }

        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()){
            String headerName = headerNames.nextElement();
            System.out.println(headerName+"=="+request.getHeader(headerName));
        }
        return "你好啊";
    }

           

測試結果

springBoot RestTemplate的http請求一get簡單的無參請求get請求網頁源碼及中文亂碼問題get帶參請求(分為兩類)post請求以此類推postForLocationput請求delete請求
springBoot RestTemplate的http請求一get簡單的無參請求get請求網頁源碼及中文亂碼問題get帶參請求(分為兩類)post請求以此類推postForLocationput請求delete請求

關于這段代碼,我說如下幾點:

getForEntity的第一個參數為我要調用的服務的位址,

getForEntity第二個參數String.class表示我希望傳回的body類型是String,當然這個類型我們可以自定義

拿到傳回結果之後,将傳回結果周遊列印出來

get請求網頁源碼及中文亂碼問題

get 擷取百度網頁源碼

//有亂碼
    public String getHello() {
        RestTemplate restTemplate = new RestTemplate(); //會亂碼
      
        ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://www.baidu.com", String.class);
        String body = responseEntity.getBody();
        HttpStatus statusCode = responseEntity.getStatusCode();
        int statusCodeValue = responseEntity.getStatusCodeValue();
        HttpHeaders headers = responseEntity.getHeaders();
        StringBuffer result = new StringBuffer();
        result.append("responseEntity.getBody():").append(body).append("==========")
                .append("responseEntity.getStatusCode():").append(statusCode).append("=========")
                .append("responseEntity.getStatusCodeValue():").append(statusCodeValue).append("==========")
                .append("responseEntity.getHeaders():").append(headers).append("==========");

        return result.toString();
    }
           

出現可亂碼

springBoot RestTemplate的http請求一get簡單的無參請求get請求網頁源碼及中文亂碼問題get帶參請求(分為兩類)post請求以此類推postForLocationput請求delete請求

中文亂碼的解決

參考

https://blog.csdn.net/a625013/article/details/52502723

public String getHello() {

        //RestTemplate restTemplate = new RestTemplate(); //會亂碼
        //解決方法1 ok https://blog.csdn.net/a625013/article/details/52502723
        StringHttpMessageConverter messageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
        RestTemplate restTemplate = new RestTemplateBuilder().additionalMessageConverters(messageConverter).build();

        ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://www.baidu.com", String.class);
        String body = responseEntity.getBody();
        HttpStatus statusCode = responseEntity.getStatusCode();
        int statusCodeValue = responseEntity.getStatusCodeValue();
        HttpHeaders headers = responseEntity.getHeaders();
        StringBuffer result = new StringBuffer();
        result.append("responseEntity.getBody():").append(body).append("==========")
                .append("responseEntity.getStatusCode():").append(statusCode).append("=========")
                .append("responseEntity.getStatusCodeValue():").append(statusCodeValue).append("==========")
                .append("responseEntity.getHeaders():").append(headers).append("==========");

        return result.toString();
    }
           

結果

springBoot RestTemplate的http請求一get簡單的無參請求get請求網頁源碼及中文亂碼問題get帶參請求(分為兩類)post請求以此類推postForLocationput請求delete請求

get帶參請求(分為兩類)

第一類getForEntity(主要有兩種方式)

第一種

public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://127.0.0.1:8080/httpByGetParams?name={1}", String.class, "張三");
        System.out.println(responseEntity.getBody());
    }
           

第一種方式

可以用一個數字做占位符,最後是一個可變長度的參數,來一一替換前面的占位符

運作

springBoot RestTemplate的http請求一get簡單的無參請求get請求網頁源碼及中文亂碼問題get帶參請求(分為兩類)post請求以此類推postForLocationput請求delete請求
springBoot RestTemplate的http請求一get簡單的無參請求get請求網頁源碼及中文亂碼問題get帶參請求(分為兩類)post請求以此類推postForLocationput請求delete請求

如果參數這樣寫

ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://127.0.0.1:8080/httpByGetParams?name={2}&as={0}", String.class, "wangwu","張三","李四");

           

列印結果為:

springBoot RestTemplate的http請求一get簡單的無參請求get請求網頁源碼及中文亂碼問題get帶參請求(分為兩類)post請求以此類推postForLocationput請求delete請求

可見占位符的順序和可變參數的順序是一一對應的,和占位符裡面的數字沒有關系,即使占位符裡面的數字相同也是如此

第二種

public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        Map<String, String> map = new HashMap<>();
        map.put("name", "李四");
        ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://127.0.0.1:8080/httpByGetParams?name={name}", String.class, map);
        System.out.println(responseEntity.getBody());
    }
           

第二種方法

也可以前面使用name={name}這種形式,最後一個參數是一個map,map的key即為前邊占位符的名字,map的value為參數值

運作

springBoot RestTemplate的http請求一get簡單的無參請求get請求網頁源碼及中文亂碼問題get帶參請求(分為兩類)post請求以此類推postForLocationput請求delete請求
springBoot RestTemplate的http請求一get簡單的無參請求get請求網頁源碼及中文亂碼問題get帶參請求(分為兩類)post請求以此類推postForLocationput請求delete請求

其他方法

第一個調用位址也可以是一個URI而不是字元串,這個時候我們建構一個URI即可,參數神馬的都包含在URI中了,如下

public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        UriComponents uriComponents = UriComponentsBuilder.fromUriString("http://127.0.0.1:8080/httpByGetParams?name={name}").build().expand("王五").encode();
        URI uri = uriComponents.toUri();
        ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class);
        System.out.println(responseEntity.getBody());
    }
           

通過Spring中提供的UriComponents來建構Uri即可。

運作

springBoot RestTemplate的http請求一get簡單的無參請求get請求網頁源碼及中文亂碼問題get帶參請求(分為兩類)post請求以此類推postForLocationput請求delete請求

自定義傳回類型

1 自定義對象

@Data
public class User {
     public User(String name,Integer age){
        this.name=name;
        this.age=age;
    }
    private String name;
    private Integer age;
}
           

修改接口傳回對象

以為Controller的注解為@RestController,是以傳回的為json對象

@GetMapping("httpByGetParams")
    public User httpByGetParams(HttpServletRequest request){
        Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String parameterName = parameterNames.nextElement();
            System.out.println(parameterName + "===" + request.getParameter(parameterName));
            //System.out.println(parameterNames.nextElement()+"=="+request.getParameter(parameterNames.nextElement()));
        }

        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()){
            String headerName = headerNames.nextElement();
            System.out.println(headerName+"=="+request.getHeader(headerName));
        }
        return new User("hello",5);
    }
           

測試

public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        UriComponents uriComponents = UriComponentsBuilder.fromUriString("http://127.0.0.1:8080/httpByGetParams?name={name}").build().expand("王五").encode();
        URI uri = uriComponents.toUri();
        ResponseEntity<User> responseEntity = restTemplate.getForEntity(uri, User.class);
        System.out.println(responseEntity.getBody());
    }
           

結果

springBoot RestTemplate的http請求一get簡單的無參請求get請求網頁源碼及中文亂碼問題get帶參請求(分為兩類)post請求以此類推postForLocationput請求delete請求
springBoot RestTemplate的http請求一get簡單的無參請求get請求網頁源碼及中文亂碼問題get帶參請求(分為兩類)post請求以此類推postForLocationput請求delete請求

第二類getForObject

getForObject函數實際上是對getForEntity函數的進一步封裝,如果你隻關注傳回的消息體的内容,對其他資訊都不關注,此時可以使用getForObject,舉一個簡單的例子,如下:

public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        User forObject = restTemplate.getForObject("http://127.0.0.1:8080/httpByGetParams", User.class);
        System.out.println(forObject);
    }
           

結果

springBoot RestTemplate的http請求一get簡單的無參請求get請求網頁源碼及中文亂碼問題get帶參請求(分為兩類)post請求以此類推postForLocationput請求delete請求

列印出來的直接是一個對象

getForObject也有幾個重載方法,如下:

springBoot RestTemplate的http請求一get簡單的無參請求get請求網頁源碼及中文亂碼問題get帶參請求(分為兩類)post請求以此類推postForLocationput請求delete請求

這幾個重載方法參數的含義和getForEntity一緻,我就不再贅述了。

post請求以此類推

post請求也有對應的兩類

postForEntity和postForObject,他與get形式的用法一一對應

這裡就不在說了

postForLocation

postForLocation也是送出新資源,送出成功之後,傳回新資源的URI,postForLocation的參數和前面兩種的參數基本一緻,隻不過該方法的傳回值為Uri,這個隻需要服務提供者傳回一個Uri即可,該Uri表示新資源的位置。

put請求

在RestTemplate中,PUT請求可以通過put方法調用,put方法的參數和前面介紹的postForEntity方法的參數基本一緻,隻是put方法沒有傳回值而已。舉一個簡單的例子,如下:

delete請求

delete請求我們可以通過delete方法調用來實作,如下例子: