首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java客户机程序以授权方式使用REST调用

Java客户机程序以授权方式使用REST调用
EN

Stack Overflow用户
提问于 2017-11-18 11:19:49
回答 1查看 1.8K关注 0票数 0

我需要调用Java代码中的REST调用。

我有全权证书的形式

  1. Id
  2. 安全密钥

一种算法提供了

  1. 获取服务器时间。
  2. 使用Id、安全密钥和服务器时间生成安全令牌

现在授权的形式如下

代码语言:javascript
复制
"Authorization": "name id=Id, serverTime=serverTime, securitytoken=securitytoken"

需要一个java客户端程序来使用上面的授权头调用REST调用。

我得到了

HTTP响应401错误。

请提供正确的方式来设置授权标头。

代码语言:javascript
复制
Name Id="Id",serverTime="2017-11-18T05:51:05",securityToken="TOKEN"

代码:

代码语言:javascript
复制
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();
        }
    }

}

错误:

服务器返回的HTTP响应代码: 401用于sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native方法的URL:https://domain/A/B/72968 ),在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.run(HttpURLConnection.java:1926),sun。net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1921) at java.security.AccessController.doPrivileged(Native方法) 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)由: java.io.IOException: Server返回的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) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)在sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338) at com.rest.client.ApplicationClient.main(ApplicationClient.java:38)

EN

回答 1

Stack Overflow用户

发布于 2017-11-18 11:29:09

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

代码语言:javascript
复制
 authorization ="Basic "+new String(new Base64().encode(authorization.getBytes()));
    conn.setRequestProperty("Authorization", authorization);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47365432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档