为什么我应该在发送http请求之前使用Base64相关算法

时间:2017-06-09 08:59:19

标签: java http utf-8

我正在做一些关于向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的内容

我无法澄清这个问题。所以有人能告诉我背后发生了什么。

1 个答案:

答案 0 :(得分:3)

这在RFC 7617

中定义
  

要获得授权,客户

     
      
  1. 从用户

  2. 获取用户ID和密码   
  3. 通过连接user-id(单个)来构造用户传递      冒号(":")字符和密码

  4.   
  5. 将用户传递编码为八位位组序列(参见下面的a      讨论字符编码方案),

  6.   
  7. 并通过编码此八位字节序列来获取基本凭证      使用Base64([RFC4648],第4节)到US-ASCII序列      字符([RFC0020])。

  8.