- 目的:使用RestController + RestClient 方式通過API 傳回。
- 一句話總結:RestController + RestCliet 方式相當于輕量級 WebService。
- 用戶端技巧
- 通過單一的orderId獲得傳回
- 構造map參數,通過map對象擷取
- 通過map對象擷取,并獲得HTTP封包頭判斷後有效傳回
-
伺服器端代碼:
package com.winter.controller;
import com.winter.model.DeptDomain; import com.winter.service.user.DeptService; import com.winter.service.user.UserService; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import javax.servlet.http.HttpServletRequest; @org.springframework.web.bind.annotation.RestController @RequestMapping(value = "/api/v1") @Slf4j @Transactional public class RestController { @Autowired private DeptService DeptService; Logger logger = LoggerFactory.getLogger(RestController.class); //POST http://localhost:8080/api/v1/order/15 //擷取param @RequestMapping(value = "/order/{orderId}", method = RequestMethod.GET) public DeptDomain getDeptDomain(@PathVariable int orderId) throws Exception { System.out.println("orderId:>>>" + orderId); DeptDomain deptDomain = DeptService.selectById(orderId); System.out.println(deptDomain.getDeptName()); return deptDomain; } }
-
用戶端代碼
package com.winter.controller;
}import com.winter.model.DeptDomain; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.client.RestTemplate; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.Map; @Controller @RequestMapping(value = "/test") @Slf4j @Configuration // 為了配合以下的使用 @Value("${api.order:#{'http://127.0.0.1:8080/api/v1'}}") public class RestClientTestController { @Autowired HttpServletRequest request; Logger logger = LoggerFactory.getLogger(RestController.class); //如要如此使用,必須加上@Configuration注釋,同時,以下文字必須使用 ' ' 包圍文字 @Value("${api.order:#{'http://127.0.0.1:8080/api/v1'}}") String base; @Autowired RestTemplateBuilder restTemplateBuilder; @GetMapping("/get/{orderId}") public @ResponseBody DeptDomain testGetDeptDomain(@PathVariable String orderId) throws Exception { RestTemplate restClient = restTemplateBuilder.build(); //Step 1 構造uri String uri = base + "/order/{orderId}"; System.out.println("uri>>>" + uri); //Step 2.1 通過單一的orderId獲得傳回 DeptDomain deptDomain1 = restClient.getForObject(uri,DeptDomain.class, orderId); //Step 2.2 構造map參數,通過map對象擷取 Map mapParam = new HashMap(); mapParam.put("orderId",orderId); DeptDomain deptDomain2 = restClient.getForObject(uri,DeptDomain.class, mapParam); //Step 2.2 通過map對象擷取,并獲得HTTP封包頭判斷後有效傳回 ResponseEntity<DeptDomain> responseEntity = restClient.getForEntity(uri,DeptDomain.class, mapParam); System.out.println(responseEntity.getStatusCode()); if (responseEntity.getStatusCode().is2xxSuccessful()) { DeptDomain deptDomain3 = responseEntity.getBody(); HttpHeaders headers = responseEntity.getHeaders(); return deptDomain3; } else { return null; } }