2014-12-03 4 views
0

Я пытаюсь преобразовать следующий скрипт Curl в Java, чтобы получить токен acces, но, похоже, все время работает с 400 или 401. Что я делаю неправильно? Является ли преобразование curl в java правильно сделанным ниже? Пожалуйста, советы ...Критерий Curl Script для Java HttpUrlConnection

Curl Сценарий:

Где, "WV3v7ZTbYmqtUOMNvO7oPhLi8RN9zFoo" является OAuth ClientID.

Java код:

String url = "https://developers.crittercism.com/v1.0/token"; 
    String urlParameters = "grant_type=password&[email protected]&password=secretpass"; 
    String clientId = "nD8FiwFiOB1rpU5HVc2ESyRAwbFOOO:"; //Just for ref 

    URL obj = new URL(url); 
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); 
    con.setDoOutput(true); 
    con.setDoInput(true); 

    //add request header 
    String basicAuth = new String(Base64.encode(clientId.getBytes())); 
    con.setRequestProperty ("Authorization", String.format("Basic %s", basicAuth)); 
    con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
    con.setRequestProperty("Accept", "*/*"); 
    con.setRequestProperty("Content-Length", Integer.toString(urlParameters.getBytes().length)); 
    con.setRequestMethod("POST"); 

    // Send post request 
    DataOutputStream wr = new DataOutputStream(con.getOutputStream()); 
    wr.writeBytes(urlParameters); 
    wr.flush(); 
    wr.close(); 

Исключение, которое бросают,

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 400 for URL: https://developers.crittercism.com/v1.0/token 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source) 
at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source) 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source) 
at CrittercismClient.sendPost(CrittercismClient.java:102) 
at CrittercismClient.main(CrittercismClient.java:26) 
Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: https://developers.crittercism.com/v1.0/token 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
at java.net.HttpURLConnection.getResponseCode(Unknown Source) 
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source) 
at CrittercismClient.sendPost(CrittercismClient.java:96) 
... 1 more 

ответ

0

Теперь он работает! Выяснилось, что двоеточие не требуется после идентификатора clientID, удаление которого заставило его работать. Но я уверен, что действительно заставило его работать, возможно, это дополнительные свойства заголовка запроса, которые я добавил. В любом случае, спасибо за ваше время!

0

encoded строка должна содержать в формате base64 client_id, а также пароль клиента, как в:

String encoded = new String(Base64.encodeBase64(new String(clientID + ":" + clientPassword))); 
1

david @ crittercis m.com здесь, я написал документы, которые вы читаете, и хотел бы помочь с этим. Я очень заботился о возврате описательных сообщений об ошибках из API, если бы вы могли опубликовать их, это было бы очень полезно.

Несколько вещей, чтобы проверить:

  • WV3v7ZTbYmqtUOMNvO7oPhLi8RN9zFoo не является допустимым OAuth2 идентификатор клиента в нашей системе (я только что проверил). Убедитесь, что вы получили идентификатор клиента OAuth2 для своего приложения. В настоящее время у нас нет автоматизированного процесса для этого (вам нужна поддержка по электронной почте), но это в нашей дорожной карте.
  • В команде cURL -u означает «Базовая авторизация»; у вас есть эта часть права. В настоящее время мы поддерживаем только публичные клиенты (не конфиденциальные), что означает, что вам не нужно использовать пароль с нашим идентификатором клиента OAuth2. Однако, поскольку вы строите строку вручную, стандарт требует, чтобы вы вводили двоеточие между именем пользователя и паролем, даже если пароль отсутствует. Таким образом, для идентификатора клиента WV3v7ZTbYmqtUOMNvO7oPhLi8RN9zFoo окончательной строкой предварительного кодирования будет «WV3v7ZTbYmqtUOMNvO7oPhLi8RN9zFoo:», который будет кодироваться в «V1YzdjdaVGJZbXF0VU9NTnZPN29QaExpOFJOOXpGb286» (как упоминает Ханс).

Сообщите мне, если любая из этих работ.

+0

Hey David, спасибо, что ответили! У меня есть действительный идентификатор OAuth, полученный по электронной почте. Никакого прогресса, даже после внесения изменений, которые вы упомянули. Проверьте отредактированный код выше. Также добавили исключение ошибки в OP. FYI скрипты curl успешно выполняются в командной строке cmd и возвращают токен доступа. – Ram