2017-07-03 3 views
0

API"Content-type:application/x-www-form-urlencoded"、リクエストタイプPOSThttps://accounts.google.com/o/oauth2/revoke?token={token})の後にGoogleトークンを取り消そうとしています。トークンを取り消します。 Restatemplate with issue

私のコード例は次のとおりです。

private static final String REVOKE_URL = "https://accounts.google.com/o/oauth2/revoke"; 
private static final String TOKEN = "token"; 
@Autowired 
private RestTemplate restTemplate; 

public void revokeToken(TokenDetailsDto tokenDetailsDto) { 
    HttpHeaders headers = new HttpHeaders(); 
    headers.add(CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE); 
    HttpEntity<?> entity = new HttpEntity(headers); 
    Map<String, String> parameters = new HashMap<>(); 
    parameters.put(TOKEN, tokenDetailsDto.getRefreshToken()); 
    LOGGER.info("used parameters:\n\turl={},\n\tentity={},\n\turiParameters={}", REVOKE_URL, entity, uriParameters); 
    restTemplate.exchange(REVOKE_URL, HttpMethod.GET, entity, Void.class, parameters); 
} 

結果は例外です:

17:30:54,323 INFO # com.nextiva.calendar.client.google.GoogleRevokeAccessService.revokeToken used parameters: 
    url=https://accounts.google.com/o/oauth2/revoke, 
    entity=<{Content-Type=[application/x-www-form-urlencoded]}>, 
    uriParameters={token=1/mzMH8VPrltarCo3LOHU_tBWi4qK5e20uIM0R_Al9T34} 
17:31:20,718 ERROR # com.nextiva.calendar.web.error.handling.BaseExceptionHandler.exception 400 Bad Request 
org.springframework.web.client.HttpClientErrorException: 400 Bad Request 
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:63) 
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700) 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:653) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:621) 
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:540) 

私はドキュメントで、それは大丈夫ですように私はPOSTを使用しようとした残りのクライアントを使用して(要求を処理するために、残りのクライアントを使用してみてください指定されたコンテンツタイプのリクエスト)。私は

restTemplate.postForEntity(REVOKE_URL, entity, Void.class, uriParameters); 

だから、問題は使用している場合

同じエラー結果は、(私のばね部)を使用してrestTemplateです。私はここで間違って何を考えていますか?

答えて

1

ソリューションは、次のとおりです。

HttpHeaders headers = new HttpHeaders(); 
    headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE); 
    HttpEntity<?> entity = new HttpEntity(headers); 
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(REVOKE_URL) 
      .queryParam("token", tokenDetailsDto.getRefreshToken()); 
    LOGGER.info("used parameters:\n\turl={},\n\tentity={},\n\turiParameters={}", REVOKE_URL, entity); 
    restTemplate.postForObject(builder.build().encode().toUri(), entity, Void.class); 

中小説明:サービスはurlParametersを期待しますが、parametersはurlParameters、そのリクエストパラメータではなかったです。そこで私はUriComponentsBuilderを使って正しい要求を作成しました。