目录
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.youkuaiyun.com/a625013/article/details/52502723
public String getHello() {
//RestTemplate restTemplate = new RestTemplate(); //会乱码
//解决方法1 ok https://blog.youkuaiyun.com/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即可。
运行
自定义返回类型
@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方法调用来实现,如下例子: