使用授权

时间:2017-11-18 11:19:50

标签: java rest client consumer

我需要从Java代码调用REST调用。

我有

形式的凭据
  1. 编号
  2. 安全密钥
  3. 提供的算法

    1. 获取服务器时间

    2. 使用Id,安全密钥&服务器时间它生成安全令牌

    3. 现在授权的格式如下

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

      需要java客户端程序使用上述授权标头调用此REST调用。

      我正在

        

      HTTP响应401错误。

      请提供正确的方法在表格请求中设置授权标题

      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:服务器返回HTTP响应代码:401为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)       在sun.net.www.protocol.http.HttpURLConnection $ 10.run(HttpURLConnection.java:1926)       在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)       在com.rest.client.ApplicationClient.main(ApplicationClient.java:48)   引起:java.io.IOException:服务器返回HTTP响应代码:401为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)       在java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)       at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338)       在com.rest.client.ApplicationClient.main(ApplicationClient.java:38)

1 个答案:

答案 0 :(得分:0)

尝试格式化授权字符串"Basic Base64"。尝试

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