【发布时间】:2017-11-18 11:19:49
【问题描述】:
我需要从 Java 代码调用 REST 调用。
我有以下形式的凭据
- 身份证
- 安全密钥
提供的算法
获取服务器时间
使用 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:服务器返回 HTTP 响应代码:401 用于 URL:https://domain/A/B/72968 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 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) 在 java.security.AccessController.doPrivileged(本机方法) 在 sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1920) 在 sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1490) 在 sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474) 在 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 在 sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1876) 在 sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474) 在 java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) 在 sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338) 在 com.rest.client.ApplicationClient.main(ApplicationClient.java:38)
【问题讨论】: