前置工作
- 先在yaml文件中设置端口号和服务名
- 需要调用的接口需要使用@EnableDiscoveryClient注册到nacos中
使用
RestTemplate
- 控制层注入nacos提供的客户端
ServiceInstance serviceInstance = discoveryClient.getInstances("service-product").get(0);
String url = serviceInstance.getHost() + ":" + serviceInstance.getPort();
//get方式获取 返回值类型
Product product = restTemplate.getForObject( "http://" + url + "/product/" + pid, Product.class);
//通过post的postForObject方法传入一个postDTO类返回一个Product类型
Product product = restTemplate.postForObject("http://" + url + "/product/", postDTO, Product.class);
// 组装请求体
HttpEntity<MultiValueMap<String, String>> request =
new HttpEntity<MultiValueMap<String, String>>(map, headers);
// 发送post请求,并打印结果,以String类型接收响应结果JSON字符串
String result = restTemplate.postForObject(url, request, String.class);
** url支持占位符语法**
如果url地址上面需要传递一些动态参数,可以使用占位符的方式:
//如果url地址上面需要传递一些动态参数,可以使用占位符的方式:
String url = "http://jsonplaceholder.typicode.com/{1}/{2}";
String url = "http://jsonplaceholder.typicode.com/{type}/{id}";
get方式
getForEntity
- getForEntity(String url,Class responseType,Object … urlVariables)
- getForEntity(String url,Class responseType,Map urlVariables)
- getForEntity(URI url,Class responseType)
public String hello() {
StringBuilder result = new StringBuilder();
// GET
//方式一
result.append(restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody()).append("<br>");
//方式二
result.append(restTemplate.getForEntity("http://HELLO-SERVICE/hello1?name={1}", String.class, "didi").getBody()).append("<br>");
//方式三
Map<String, String> params = new HashMap<>();
params.put("name", "dada");
result.append(restTemplate.getForEntity("http://HELLO-SERVICE/hello1?name={name}", String.class, params).getBody()).append("<br>");
//方式四
UriComponents uriComponents = UriComponentsBuilder.fromUriString(
"http://HELLO-SERVICE/hello1?name={name}")
.build()
.expand("dodo")
.encode();
URI uri = uriComponents.toUri();
result.append(restTemplate.getForEntity(uri, String.class).getBody()).append("<br>");
}
getForObject
- getForObject(String url,Class responseType,Object … urlVariables)
- getForObject(String url,Class responseType,Map urlVariables)
- getForObject(URI url,Class responseType)
RestTemplate restTemplate = new RestTemplate();
String result=restTemplate.getForObject(uri,String.class)
//当body是一个User对象时,可以直接这样实现:
RestTemplate restTemplate = new RestTemplate();
User result=restTemplate.getForObject(uri,User.class)
post方式
- post提交的两种方式
- postForObject()
- postForEntity()
- 区别
- postForObject()返回值是HTTP协议的响应体。
- postForEntity()返回的是ResponseEntity,ResponseEntity是对HTTP响应的封装,除了包含响应体,还包含HTTP状态码、contentType、contentLength、Header等信息。
postForObject()
@SpringBootTest
class PostTests {
@Resource
private RestTemplate restTemplate;
@Test
void testSimple() {
// 请求地址
String url = "http://jsonplaceholder.typicode.com/posts";
// 要发送的数据对象
PostDTO postDTO = new PostDTO();
postDTO.setUserId(110);
postDTO.setTitle("zimug 发布文章");
postDTO.setBody("zimug 发布文章 测试内容");
// 发送post请求,并输出结果
PostDTO result = restTemplate.postForObject(url, postDTO, PostDTO.class);
System.out.println(result);
}
}
@Test
public void testForm() {
// 请求地址
String url = "http://jsonplaceholder.typicode.com/posts";
// 请求头设置,x-www-form-urlencoded格式的数据
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
//提交参数设置
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("title", "zimug 发布文章第二篇");
map.add("body", "zimug 发布文章第二篇 测试内容");
// 组装请求体
HttpEntity<MultiValueMap<String, String>> request =
new HttpEntity<MultiValueMap<String, String>>(map, headers);
// 发送post请求,并打印结果,以String类型接收响应结果JSON字符串
String result = restTemplate.postForObject(url, request, String.class);
System.out.println(result);
}
postForEntity()
上面的所有的postForObject请求传参方法,postForEntity都可以使用,使用方法上也几乎是一致的,只是在返回结果接收的时候略有差别。使用ResponseEntity responseEntity来接收响应结果responseEntity.getBody()获取响应体。响应体内容同postForObject方法返回结果一致。剩下的这些响应信息就是postForEntity比postForObject多出来的内容。
- HttpStatus statusCode = responseEntity.getStatusCode();获取整体的响应状态信息
- int statusCodeValue = responseEntity.getStatusCodeValue(); 获取响应码值
- HttpHeaders headers = responseEntity.getHeaders();获取响应头等
@Test
public void testEntityPoJo() {
// 请求地址
String url = "http://jsonplaceholder.typicode.com/posts";
// 要发送的数据对象
PostDTO postDTO = new PostDTO();
postDTO.setUserId(110);
postDTO.setTitle("zimug 发布文章");
postDTO.setBody("zimug 发布文章 测试内容");
// 发送post请求,并输出结果
ResponseEntity<String> responseEntity
= restTemplate.postForEntity(url, postDTO, String.class);
String body = responseEntity.getBody(); // 获取响应体
System.out.println("HTTP 响应body:" + postDTO.toString());
//以下是postForEntity比postForObject多出来的内容
HttpStatus statusCode = responseEntity.getStatusCode(); // 获取响应码
int statusCodeValue = responseEntity.getStatusCodeValue(); // 获取响应码值
HttpHeaders headers = responseEntity.getHeaders(); // 获取响应头
System.out.println("HTTP 响应状态:" + statusCode);
System.out.println("HTTP 响应状态码:" + statusCodeValue);
System.out.println("HTTP Headers信息:" + headers);
}