2017-11-18 154 views
0

我需要調用Java代碼中REST調用REST調用。Java客戶端程序消耗與授權

我在

  1. 編號
  2. 保障形式主要憑據

提供的算法,這

  1. 獲取服務器時間

  2. 使用標識,安全密鑰它生成一個安全令牌

現在授權在下面的表格

"Authorization": "name id=Id, serverTime=serverTime, securitytoken=securitytoken" 

需要一個Java客戶端程序來調用使用上述授權頭這個REST調用&服務器時間。

我越來越

HTTP Response 401 error.

請提供正確的方式來設置授權標頭以請求的形式

Name Id="Id",serverTime="2017-11-18T05:51:05",securityToken="TOKEN" 

代碼:

package com.rest.client; 

import java.io.BufferedReader; 

import java.io.InputStreamReader; 

import java.net.HttpURLConnection; 

import java.net.URL; 

public class Sample { 

    public final static String GATEWAY_ID = "Id"; 

    public final static String KEY = "Key"; 

    public static void main(String[] args) { 

     try { 

      HttpURLConnection conn; 

      conn = (HttpURLConnection) new URL("https://domain/A/B/72968").openConnection(); 

      String serverTime = "2017-11-18T10:51:05"; 

      String securityToken = "TOKEN"; 

      String authorization = "Name Id=\"" + GATEWAY_ID + "\",serverTime=\"" + serverTime + "\",securityToken=\"" 
        + securityToken + "\""; 

      // Name Id="Id",serverTime="2017-11-18T10:51:05",securityToken="TOKEN" 

      conn.addRequestProperty("Authorization", authorization); // Is Header set is correct? It should be part of Request Header. Please correct this 

      int status = conn.getResponseCode(); 

      System.out.println(status); 

      BufferedReader br = null; 

      StringBuilder body = null; 

      String line = ""; 

      br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

      body = new StringBuilder(); 

      while ((line = br.readLine()) != null) { 
       body.append(line); 
      } 

      System.out.println(body); 

     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } 
    } 

} 

錯誤:

java.io.IOException: Server returned HTTP response code: 401 for URL: https://domain/A/B/72968 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1926) at sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1921) at java.security.AccessController.doPrivileged(Native Method) at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1920) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1490) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) at com.rest.client.ApplicationClient.main(ApplicationClient.java:48) Caused by: java.io.IOException: Server returned HTTP response code: 401 for URL: https://domain/A/B/72968 at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1876) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338) at com.rest.client.ApplicationClient.main(ApplicationClient.java:38)

回答

0

嘗試格式授權字符串這樣"Basic Base64"。嘗試

authorization ="Basic "+new String(new Base64().encode(authorization.getBytes())); 
    conn.setRequestProperty("Authorization", authorization); 
+0

感謝評論。試過,但還是得到了HTTP 401 –

+0

因此,似乎有一個問題: 字符串授權= 「名稱ID = \」」 + GATEWAY_ID + 「\」,serverTime = \ 「」 + serverTime + 「\」,securityToken = \ 「」+ securityToken +「\」「; – Nonika

+0

看起來你已經和授權字符串的只是例子不是一個實際的參數傳遞的授權。 – Nonika