2017-11-18 147 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

相关问题