当前位置: 首页 > 知识库问答 >
问题:

使用REST调用并进行授权的Java客户端程序

微生信鸿
2023-03-14

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

我有以下形式的证书

  1. id
  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();
            }
        }
    
    }
    

    错误:

    sun.net.www.protocol.http.IOException:服务器返回HTTP响应代码: 401 URL: https://domain/A/B/72968在onnection.getNativeConstructorAccessorIonnection.java:1920Instance0(本机方法)在sun.net.www.protocol.http.NativeConstructorAccessorIonnection.get实例(NativeConstructorAccessorIonnection.java:1490)在sun.net.www.protocol.http.委托构造访问onnection.get实例(委托构造访问onnection.java:1474)在sun.net.www.protocol.https.Cmpl.get实例(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)在java.security.AccessController.do特权(本机方法)在java.io.HttpURLCsun.reflect.ChainedException(HttpURLCmpl.new)在sun.reflect.HttpURLCmpl.newInputStream0(HttpURLCmpl.java:62)在sun.reflect.HttpURLCmpl.newInputStream(HttpURLCmpl.java:45)在java.lang.reflect.HttpsURLConnectionIonstructor.newInputStream(HttpsURLConnectionIApplication. main(Application. java: 38)

  • 共有1个答案

    从劲
    2023-03-14

    尝试用这种方式格式化授权字符串“Basic Base64”。尝试

     authorization ="Basic "+new String(new Base64().encode(authorization.getBytes()));
        conn.setRequestProperty("Authorization", authorization);
    
     类似资料:
    • 一段时间以来,我一直在撞墙,试图使用注释在JavaEE7 REST应用程序上启用身份验证/授权。无论我多么努力,我都会收到这个错误: 经过一些谷歌搜索,我发现人们建议删除文件夹,但这没有效果。我还将日志记录级别设置为FINE,它提供了这个相关的日志条目: 除此之外: 到目前为止,我只尝试在一个入口点实现它,代码就是这样的。首先,我声明角色“users”(与glassfish服务器上的组名相同),然

    • 事情是运行Rest服务从任何客户端像邮递员,我需要先登录到我的应用程序在浏览器和登录后Rest调用将在RESTClient工作(火狐)。但是万一Jmetm怎么跑呢。我已经添加了授权。(用户名和密码)使用HTTP授权管理器仍然面临。甚至我还添加了bean外壳脚本: 仍然没有跑步Rest。将错误作为错误凭据提供。 有人请指引我。

    • 问题内容: 有了JSR 311及其实现,我们有了一个强大的标准,可以通过REST公开Java对象。但是,在客户端,似乎缺少与SOAP的Apache Axis类似的东西-隐藏了Web服务并将数据透明地封送回Java对象的东西。 您如何创建Java RESTful客户端?使用HTTPConnection和手动解析结果?还是专业客户(例如Jersey或Apache CXR)? 问题答案: 这是一个古老的

    • 假设我有2个微服务A和B。现在对于服务A上的特定请求,A需要对B进行多个相同API的API调用(使用不同的参数)。最初,我使用模拟客户端在微服务之间进行Rest调用[隐式支持负载平衡、服务发现和添加端口元数据等来自模拟客户端]。 这种方法的问题是,调用是同步的,并且需要大量时间。如何/使用什么来触发多个请求并以非阻塞和异步的方式等待响应? TIA!

    • OAuth2 JWT 配置文件引入了将 JWT 用作授权授予和客户端身份验证的可能性。 JWT客户端身份验证功能独立于特定的授权类型,并且可以与任何授权类型一起使用,也可以与客户端凭据授权一起使用。 但是,使用 JWT 授权类型似乎与将客户端凭据授予与 JWT 客户端身份验证结合使用完全相同,只是语法略有不同。 在这两种情况下,客户端都会联系令牌终结点以获取访问令牌: vs

    • 问题内容: 我在Javascript中使用以下代码进行Ajax调用: 我也想在Java中做到这一点。基本上,我想编写一个Java客户端应用程序,该应用程序通过Ajax调用将该数据发送到服务器。 如何在Java中执行Ajax? 问题答案: AJAX与任何其他HTTP调用均没有不同。您基本上可以从Java发布相同的URL,就目标服务器而言,这无关紧要: 上面的代码或多或少与您的jQuery AJAX调