目錄
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 "你好啊";
}
測試結果
關于這段代碼,我說如下幾點:
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();
}
出現可亂碼
中文亂碼的解決
參考
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();
}
結果
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());
}
第一種方式
可以用一個數字做占位符,最後是一個可變長度的參數,來一一替換前面的占位符
運作
如果參數這樣寫
ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://127.0.0.1:8080/httpByGetParams?name={2}&as={0}", String.class, "wangwu","張三","李四");
列印結果為:
可見占位符的順序和可變參數的順序是一一對應的,和占位符裡面的數字沒有關系,即使占位符裡面的數字相同也是如此
第二種
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為參數值
運作
其他方法
第一個調用位址也可以是一個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即可。
運作
自定義傳回類型
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());
}
結果
第二類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);
}
結果
列印出來的直接是一個對象
getForObject也有幾個重載方法,如下:
這幾個重載方法參數的含義和getForEntity一緻,我就不再贅述了。
post請求以此類推
post請求也有對應的兩類
postForEntity和postForObject,他與get形式的用法一一對應
這裡就不在說了
postForLocation
postForLocation也是送出新資源,送出成功之後,傳回新資源的URI,postForLocation的參數和前面兩種的參數基本一緻,隻不過該方法的傳回值為Uri,這個隻需要服務提供者傳回一個Uri即可,該Uri表示新資源的位置。
put請求
在RestTemplate中,PUT請求可以通過put方法調用,put方法的參數和前面介紹的postForEntity方法的參數基本一緻,隻是put方法沒有傳回值而已。舉一個簡單的例子,如下:
delete請求
delete請求我們可以通過delete方法調用來實作,如下例子: