2017-02-07 10 views
0

У меня есть следующий запрос с завитком, который говорит с службами Microsoft Azure без проблем.Плохой запрос конвертирования curl http-запроса на Java

curl --request POST https://login.microsoftonline.com/common/oauth2/v2.0/token --data 'client_id=fe37...06-566f5c762ab2&grant_type=authorization_code&client_secret=tPv..dQfqomaG&scope=mail.read&code=OAQABAAIA...gAA' 

Вот Java-код, который бросает исключение Bad Request:

public String getToken(String authCode){ 

     try { 

      HttpHeaders headers = new HttpHeaders(); 

      String url = "https://login.microsoftonline.com/common/oauth2/v2.0/token"; 
      UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url); 
      headers.add("client_id", "fe3..b2"); 
      headers.add("client_secret", "tP..aG"); 
      headers.add("grant_type", "authorization_code"); 
      headers.add("code", authCode); 
      headers.add("scope", "mail.read"); 


      HttpEntity<?> entity = new HttpEntity<>(headers); 
      RestTemplate restTemplate = new RestTemplate(); 

      HttpEntity<String> response = restTemplate.exchange(builder.build().toUri(), HttpMethod.POST, entity, String.class); 


     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     } 
     return null; 

    } 

Я также попытался добавить --data раздел к параметрам объекта, и я получаю ту же проблему. Я использую RestTemplate, но я открыт для других предложений.

Я обращаюсь к вам за помощью.

ответ

1

Я предполагаю, что проблема заключается в том, что в примере вы передаете эти параметры внутри тела POST, тогда как в вашем java-коде вместо этого используются заголовки. Попробуйте изменить его к использованию Params тела entity объекта:

MultiValueMap<String, String> body = new LinkedMultiValueMap<String, String>();  

body.add("client_id", "fe3..b2"); 
// ... rest params 

// Note the body object as first parameter! 
HttpEntity<?> entity = new HttpEntity<Object>(body, new HttpHeaders()); 
+0

Ты обалденный! – WowBow

0

Вы должны отправить эти параметры в запросе лица, отформатированный форма URL кодируются, а также установить тип содержимого для application/x-www-form-urlencoded.

Ваше тело может быть строка (по вашему примеру):

String data = "client_id=fe37...06-566f5c762ab2&grant_type=authorization_code&client_secret=tPv..dQfqomaG&scope=mail.read&code=OAQABAAIA...gAA"; 
HttpEntity<String> entity = new HttpEntity<>(data); 

Установить тип содержимого заголовка:

headers.add("Content-Type", "application/x-www-form-urlencoded"); 

(Фактическая реализация зависит от библиотеки вы используете)

Смежные вопросы