2016-12-17 7 views
0

Я пытаюсь подключиться к счету производства Salesforce через OAuth и обменять токен доступа, предоставив токен обновления.Соединение Java HTTPS (SSL) Возврат 400 Статус, где CURL/ARC работает для одного и того же URL-адреса

Когда я делаю вызов с помощью Chrome Advanced Rest Client или CURL, я могу получить токен доступа; но когда я пытаюсь сделать тот же вызов, используя java HttpClient или URLConnection, я получаю статус 400.

String url = "https://login.salesforce.com/services/oauth2/token"; 
    String requestBody = "grant_type=refresh_token&client_id=myClientId&client_secret=myClientSecret&refresh_token=myRefreshToken"; 

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

    //add reuqest header 
    con.setRequestMethod("POST"); 
    con.setRequestProperty("User-Agent", "myapp/1.0"); 
    con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); 

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

    int responseCode = con.getResponseCode(); 
    System.out.println("\nSending 'POST' request to URL : " + url); 
    System.out.println("Post parameters : " + requestBody); 
    System.out.println("Response Code : " + responseCode); 

    BufferedReader br = new BufferedReader(
      new InputStreamReader(con.getInputStream())); 
    String inputLine; 
    StringBuffer response = new StringBuffer(); 

    while ((inputLine = br.readLine()) != null) { 
     response.append(inputLine); 
    } 
    br.close(); 

    //print result 
    System.out.println(response.toString()); 

Я рассмотрел оба запроса, используя wirehark. И оба запроса выглядят одинаково. Поскольку URL-адрес https, я отправил запрос на фиктивный URL-адрес и подтвердил использование wirehark.

Кто-нибудь сталкивался с этой проблемой? BTW тот же код работает для версии для разработчиков и не работает для выпускной версии. А для выпускаемой продукции он работает с CURL и Chrome ARC.

+0

Пробовали ли вы пост подключения к другим сайтам? Я думаю, что закрытие DataOutputStream (wr) перед чтением ответа может быть проблемой, особенно если заголовок Content-Length не отправлен в запросе. Существует пример кода для отправки почтовых запросов здесь https://www.mkyong.com/java/how-to-send-http-request-getpost-in-java/ –

+0

Да, это почти то же самое. Даже при закрытии его все еще остается одна и та же проблема. Обновлен код в вопросе. – JChap

ответ

0

Salesforce допускает только HTTPS-соединения на TLS 1.1 или выше. Поскольку я работаю на Java 7, по умолчанию используется TLS 1.0. В результате запрос не работает с Java.

Добавляя следующее свойство мы можем добавить поддержку TLSv1.1 и TLSv1.2

-Dhttps.protocols=TLSv1.1,TLSv1.2