我正在做一些关于向Teamcity服务器发送http REST请求的事情。 对于身份验证部分,当我使用下面的代码时,我将收到401错误。
public class Client {
public static void main(String args[]){
try{
Client client = new Client();
client.sendGet();
//client.sendPost();
}catch(Exception e){
e.printStackTrace();
}
}
String USER_AGENT = "";
private void sendGet() throws Exception {
String url = "http://localhost:80/httpAuth/app/rest/builds";
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent", USER_AGENT);
String login = "gearon";
String password = "gearonpassword";
String token = login + ":" + password;
con.setRequestProperty ("Authorization", "Basic " + token);
int responseCode = con.getResponseCode();
System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
}
}
我通过添加以下代码来解决问题
byte[] tokenArr = StringUtils.getBytesUtf8(token);
String encoded = new String(Base64.encodeBase64(tokenArr));
con.setRequestProperty ("Authorization", "Basic " + token);
然而,我无法弄清楚为什么这解决了我的问题。我的用户名或密码中没有任何特殊字符。并且,我已通过右键单击项目将项目编码设置为Eclipse中的UTF-8 - >属性 - >资源 - >文本文件编码 - > UTF-8。
getBytesUtf8
方法的javadoc是
使用UTF-8将给定字符串编码为字节序列 charset,将结果存储到新的字节数组中。
如果我的项目已经使用UTF-8,则此方法不应添加任何值。
对于另一种方法encodeBase64
,javadoc是:
使用base64算法对二进制数据进行编码,但不会对其进行分块 输出
也许有惊人的发生。我在wiki
中阅读了有关Base64的内容我无法澄清这个问题。所以有人能告诉我背后发生了什么。
答案 0 :(得分:3)
这在RFC 7617:
中定义要获得授权,客户
- 获取用户ID和密码
从用户
通过连接user-id(单个)来构造用户传递 冒号(":")字符和密码
将用户传递编码为八位位组序列(参见下面的a 讨论字符编码方案),
- 醇>
并通过编码此八位字节序列来获取基本凭证 使用Base64([RFC4648],第4节)到US-ASCII序列 字符([RFC0020])。