繁体   English   中英

Java客户端程序通过授权使用REST调用

[英]Java client program to consume REST call with authorization

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

我有以下形式的凭证

  1. ID
  2. 安全密钥

提供了一种算法

  1. 获取服务器时间

  2. 使用ID,安全密钥和服务器时间生成安全令牌

现在授权采用以下形式

"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:服务器返回URL的HTTP响应代码:401: https:// domain / A / B / 72968,位于sun.reflect.NativeConstructorAccessorImpl.newInstance0 (本机方法),位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl。 java:62)在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)在java.lang.reflect.Constructor.newInstance(Constructor.java:423)在sun.net.www.protocol.http.HttpURLConnection $ 10。在sun.net.www.protocol.http.HttpURLConnection $ 10.run(HttpURLConnection.java:1921)在sun.net.www.protocol处运行(HttpURLConnection.java:1921)在java.security.AccessController.doPrivileged(本机方法)处sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1490)上的.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1920)at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection .java:1474),位于sun.net.www.protocol.https.HttpsURLConnectionImpl.getIn com.rest.client.ApplicationClient.main(ApplicationClient.java:48)处的putStream(HttpsURLConnectionImpl.java:254)原因:java.io.IOException:服务器返回的HTTP响应代码:401表示URL: https:// domain / A / B / 72968,位于java.sun.net.www.protocol.http.HttpURLConnection.getInputStream0 (HttpURLConnection.java:1876),位于java.sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)。 sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338)上的net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)在com.rest.client.ApplicationClient.main(ApplicationClient.java:38)

尝试使用"Basic Base64"这样的格式授权字符串。 尝试

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM