API設計三
14314 ワード
1 RestTemplateの作成
プロジェクトでは通常、プロジェクトが開始されるとSpringコンテナにRestTemplateのbeanを作成し、必要に応じて直接注入すればいいです.@Configuration
public class RestTemplateConfig {
@Value("${restTemplate.connectionRequestTimeout}")
private int connectionRequestTimeout; //
@Value("${restTemplate.connectionTimeout}")
private int connectionTimeout; //
@Value("${restTemplate.readTimeout}")
private int readTimeout; //
@Bean
@Primary
public RestTemplate customRestTemplate(){
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectionRequestTimeout(connectionRequestTimeout);
httpRequestFactory.setConnectTimeout(connectionTimeout);
httpRequestFactory.setReadTimeout(readTimeout);
return new RestTemplate(httpRequestFactory);
}
}
ここでは、プロファイルに適切な構成パラメータを追加する必要があります.restTemplate.connectionRequestTimeout = 300000
restTemplate.connectionTimeout = 300000
restTemplate.readTimeout = 300000
2 RestTemplate使用
2.1 RestTemplateのget要求
(1) public T getForObject(String url, Class responseType, Map uriVariables) throws RestClientException
パラメータの意味:
@Configuration
public class RestTemplateConfig {
@Value("${restTemplate.connectionRequestTimeout}")
private int connectionRequestTimeout; //
@Value("${restTemplate.connectionTimeout}")
private int connectionTimeout; //
@Value("${restTemplate.readTimeout}")
private int readTimeout; //
@Bean
@Primary
public RestTemplate customRestTemplate(){
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectionRequestTimeout(connectionRequestTimeout);
httpRequestFactory.setConnectTimeout(connectionTimeout);
httpRequestFactory.setReadTimeout(readTimeout);
return new RestTemplate(httpRequestFactory);
}
}
restTemplate.connectionRequestTimeout = 300000
restTemplate.connectionTimeout = 300000
restTemplate.readTimeout = 300000
2.1 RestTemplateのget要求
(1) public T getForObject(String url, Class responseType, Map uriVariables)
throws RestClientException
パラメータの意味:
@Test
public void testGetForObject_one(){
String url = HOST +"/api-demo/user";
Map paramMap = new HashMap<>();
paramMap.put("name","rose");
paramMap.put("age",22);
User user = restTemplate.getForObject(url+"?name={name}&age={age}",User.class,paramMap);
logger.debug("user:"+user);
}
(2)public T getForObject(String url,Class responseType,Object...uriVariables)throws RestClientExceptionパラメータの意味:
@Test
public void testGetForObject_two(){
String url = HOST +"/api-demo/user";
Object[] arr = new Object[]{"rose", 22};
// URL
User user = restTemplate.getForObject(url+"?name={name}&age={age}",User.class,arr);
logger.debug("user:"+user);
}
(3)public ResponseEntity getForEntity(String url,Class responseType,Map uriVariables)throws RestClientExceptionこの方法は(1)方法の使用と同様であり,この方法の戻り結果がResponseEntityであり,戻り結果から応答状態や応答体などの情報を得ることができる.
応答体を処理するコードは次のとおりです.
/**
* responseEntity
* @param responseEntity
*/
private void disposeResponseEntity(ResponseEntity responseEntity) {
// code
int code = responseEntity.getStatusCodeValue();
logger.debug("httpstatus code:"+code);
//
if(code > 1000){
String errorMessage = String.valueOf(responseEntity.getHeaders().get("Error-Message"));
logger.debug("Error-Message:"+errorMessage);
}
//
User user = responseEntity.getBody();
logger.debug("user:"+user);
}
例:
@Test
public void testGetFoEntity_one(){
String url = HOST +"/api-demo/user";
Map paramMap = new HashMap<>();
paramMap.put("name","rose");
paramMap.put("age",22);
ResponseEntity responseEntity = restTemplate.getForEntity(url+"?name={name}&age={age}",User.class,paramMap);
disposeResponseEntity(responseEntity);
}
(4)public ResponseEntity getForEntity(String url,Class responseType,Object...uriVariables)throws RestClientExceptionこの方法は(2)方法の使用と同様であり,この方法の戻り結果はResponseEntityであり,戻り結果から応答状態や応答体などの情報を得ることができる.例:
@Test
public void testGetFoEntity_two(){
String url = HOST +"/api-demo/user";
Object[] arr = new Object[]{"rose", -10};
ResponseEntity responseEntity = restTemplate.getForEntity(url+"?name={name}&age={age}",User.class,arr);
disposeResponseEntity(responseEntity);
}
(5)public ResponseEntity getForEntity(URI url,Class responseType)throws RestClientExceptionパラメータの意味:
@Test
public void testGetFoEntity_three(){
String url = HOST +"/api-demo/user";
url = url+"?name=rose&age=22";
URI uri = null;
try {
uri = new URI(url);
} catch (URISyntaxException e) {
e.printStackTrace();
}
ResponseEntity responseEntity = restTemplate.getForEntity(uri,User.class);
disposeResponseEntity(responseEntity);
}
2.2 RestTemplateのpost要求
(1)public T postForObject(String url,@Nullable Object request,Class responseType,Object...uriVariables)throws RestClientExceptionパラメータの意味:
同様の方法1:public T postForObject(String url,@Nullable Object request,Class responseType,Map uriVariables)throws RestClientException法は(1)とほぼ同じであり,使用も同様であるが,この方法の最後のurlパラメータの伝達値はMapを用いているため,urlパラメータがない場合は直接Map(new HashMap()を空にする.
同様の方法2:public T postForObject(URI url,@Nullable Object request,Class responseType)throws RestClientException法と(1)は基本的に同じで、使用も同じで、異なることにこの方法のurlパラメータはURIオブジェクトであり、最後のパラメータはないので、urlにパラメータがある場合はurlの後ろに直接つなぐ必要があります.例:URI uri=new URI("http://localhost:8080/api/demo?name=zhangsan").例:
@Test
public void testPostForObject_one(){
String url = HOST +"/api-demo/json/user?dept={dept}";
Object[] arr = new Object[]{"finance"};
int result = restTemplate.postForObject(url,new User("liutao",12,"liutao123"),int.class,arr);
logger.debug("result:"+result);
}
(2)public ResponseEntity postForEntity(String url,@Nullable Object request,Class responseType,Object...uriVariables)throws RestClientExceptionパラメータの意味:
同様の方法1:public ResponseEntity postForEntity(String url,@Nullable Object request,Class responseType,Map uriVariables)throws RestClientException法は(2)とほぼ同じであり,使用も同様であるが,この方法の最後のurlパラメータの伝達値はMapを用いているため,urlパラメータがない場合はそのままMap(new HashMap()を空にする.
同様の方法2:public ResponseEntity postForEntity(URI url,@Nullable Object request,Class responseType)throws RestClientExceptionは、最初のパラメータをURIに置き換えるだけでよい.たとえば、最初のパラメータは、URI uri=new URI("http://localhost:8080/api/demo");
例:
@Test
public void testPostForEntity(){
String url = HOST +"/api-demo/json/user?dept={dept}";
Object[] arr = new Object[]{"finance"};
ResponseEntity responseEntity = restTemplate.postForEntity(url,new User("liutao",12,
"liutao123"),
Integer.class,arr);
logger.debug("responseEntity:"+responseEntity);
}
(3)プレゼンテーションデータ転送はformフォーム形式で行う
@Test
public void testPostForm(){
String url = HOST +"/api-demo/form/user";
//
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
//
MultiValueMap params= new LinkedMultiValueMap<>();
params.add("name", "liutao");
params.add("age", "12");
params.add("password", "liutao123");
//
HttpEntity> requestEntity = new HttpEntity<>(params,headers);
ResponseEntity responseEntity = restTemplate.postForEntity(url,requestEntity,Integer.class);
logger.debug("responseEntity:"+responseEntity);
}
2.3 RestTemplateのput要求
(1) public void put(String url, @Nullable Object request, Object... uriVariables) throws RestClientException
パラメータの意味:
例:
@Test
public void testPut(){
String url = HOST +"/api-demo/user";
User user = new User("liutao",12,"liutao123");
restTemplate.put(url,user);
}
2.4 RestTemplateのpatch要求
(1) public T patchForObject(String url, @Nullable Object request, Class responseType, Object... uriVariables) throws RestClientException
パラメータの意味:
同様の方法1:public T patchForObject(String url,@Nullable Object request,Class responseType,Map uriVariables)throws RestClientException法は「プレゼンテーション方法」とほぼ同じであり、この方法の最後のurlパラメータの伝値ではMapが使用されるため、urlパラメータがない場合はMap(new HashMap()を直接空にする.
同様の方法2:public T patchForObject(URI url,@Nullable Object request,Class responseType)throws RestClientExceptionこの方法は「プレゼンテーション方法」とほぼ同じで、urlとは異なる.たとえば、最初のパラメータは、URI uri=new URI("http://localhost:8080/api/demo");
例:
@Test
public void testPatch(){
String url = HOST +"/api-demo/user/1212?name={name}";
Object[] arr = new Object[]{"rose"};
Integer result = restTemplate.patchForObject(url,null,Integer.class,arr);
logger.debug("result:"+result);
}
2.5 RestTemplateのDELETEリクエスト
(1) public void delete(String url, Object... uriVariables)
パラメータの意味:
注意:ここのdeleteメソッドは応答を取得していませんが、応答を取得するにはどうすればいいですか?では、deleteリクエストを直接exchangeメソッドで実現するしかありません.
例:
@Test
public void testDelete(){
String url = HOST +"/api-demo/user?name={name}&age={age}";
Object[] arr = new Object[]{"rose", 10};
restTemplate.delete(url,arr);
}
2.6 RestTemplateのEXCHANGEリクエスト
(1) public ResponseEntity exchange(String url, HttpMethod method, @Nullable HttpEntity> requestEntity, Class responseType, Object... uriVariables) throws RestClientException
パラメータの意味:
url:urlアドレスmethod:httpリクエストメソッドは、HttpMethod列挙クラスによってrequestEntity:リクエストエンティティを取得し、リクエストヘッダとリクエストボディの情報を含むことができるresponseType:レスポンスタイプuriVariables:urlアドレスパラメータであり、urlアドレスにパラメータがない場合、このパラメータを記入しなくても、このメソッドは戻り結果ResponseEntityからレスポンスステータスコードやレスポンスヘッダやレスポンスボディなどの情報を取得することができる.同様の方法1:public ResponseEntity exchange(String url,HttpMethod,@Nullable HttpEntity>requestEntity,Class responseType,Map uriVariables)throws RestClientException法は(1)とほぼ同じであり、使用も同様であるが、異なるのはこの方法の最後のurlパラメータの伝値がMapであるため、urlパラメータがない場合はMap(new HashMap()を直接空にする.同様の方法2:public ResponseEntity exchange(URI url,HttpMethod,@Nullable HttpEntity>requestEntity,Class responseType)throws RestClientExceptionメソッドは(1)とほぼ同じであり、使用も同様であるが、このメソッドのurlパラメータはURIオブジェクトであり、最後のパラメータがないため、urlにパラメータがある場合はurlの後ろに直接つなぐ必要がある.例:URI uri=new URI("http://localhost:8080/api/demo?name=zhangsan")
例:@Test
public void testExchange_one(){
//
MultiValueMap headers = new LinkedMultiValueMap();
headers.add("Accept","application/json");
headers.add("Content-Type","application/json");
//
User user = new User("dasf",12,"liutao123");
HttpEntity requestEntity = new HttpEntity(user,headers);
String url = HOST +"/api-demo/user";
ResponseEntity responseEntity = restTemplate.exchange(url,
HttpMethod.PUT,requestEntity,Integer.class);
logger.debug("responseEntity:"+responseEntity);
}
(2)デモではtoken配置再要求ヘッダをバックグラウンドに渡して検証し,exchangeメソッドでget要求をコミットし,パラメータでrequestHeadersを指定して要求ヘッダパラメータを設定する
例:@Test
public void howToSendToken(){
String url = HOST +"/api-demo/finance/user?name={name}";
Map paramMap = new HashMap<>();
paramMap.put("name","rose");
//
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set("token",UUID.randomUUID().toString());
HttpEntity requestEntity = new HttpEntity<>(null, requestHeaders);
ResponseEntity responseEntity = restTemplate.exchange(url,
HttpMethod.GET,requestEntity,User.class,paramMap);
logger.debug(responseEntity.getBody().toString());
}
作者:ONROAD 0612出典:CSDN原文:https://blog.csdn.net/ONROAD0612/article/details/82258193本文は博主のオリジナルの文章で、転載して博文のリンクを添付してください!
@Test
public void testExchange_one(){
//
MultiValueMap headers = new LinkedMultiValueMap();
headers.add("Accept","application/json");
headers.add("Content-Type","application/json");
//
User user = new User("dasf",12,"liutao123");
HttpEntity requestEntity = new HttpEntity(user,headers);
String url = HOST +"/api-demo/user";
ResponseEntity responseEntity = restTemplate.exchange(url,
HttpMethod.PUT,requestEntity,Integer.class);
logger.debug("responseEntity:"+responseEntity);
}
@Test
public void howToSendToken(){
String url = HOST +"/api-demo/finance/user?name={name}";
Map paramMap = new HashMap<>();
paramMap.put("name","rose");
//
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set("token",UUID.randomUUID().toString());
HttpEntity requestEntity = new HttpEntity<>(null, requestHeaders);
ResponseEntity responseEntity = restTemplate.exchange(url,
HttpMethod.GET,requestEntity,User.class,paramMap);
logger.debug(responseEntity.getBody().toString());
}