如何使用 android 的 httpURL 连接设置授权 header
how to set authorization header with android's httpURLconnection
我正在尝试使用基本身份验证连接到我的服务器,但是当我设置授权时 header,它导致 getInputStream 抛出 fileNotFound 异常。
相关代码如下:
URL url = new URL(myurl);
//set up the connection
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);//this is in milliseconds
conn.setConnectTimeout(15000);//this is in milliseconds
String authHeader = getAuthHeader(userID,pass);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setRequestProperty("authorization", authHeader);
//starts the query
conn.connect();
int response = conn.getResponseCode();
is = conn.getInputStream(); //throws the fileNotFound exception
这是抛出的异常:
java.io.FileNotFoundException: http://<myIPaddress>/login/
奇怪的是,如果我尝试将请求 属性 设置为 "authorization" 或 [=51],我发现 fileNotFound 异常 仅 抛出=] 或该词的任何变体。如果我将它设置为 "content-type" 或 "authosodifjsodfjs" (随机字符串),它是 not 抛出,如下所示:
conn.setRequestProperty("content-type",authHeader)//no exception thrown
conn.setRequestProperty("authosodifjsodfjs",authHeader)//no exception thrown
如果我不设置此 header,我可以使用此代码连接到服务器并获得我期望的正确 access-denied 消息。
如果我使用 python 的 "requests" 模块,我也能够连接到服务器并正确登录,所以这不是服务器的问题。
所以我的问题如下:
1) 将请求 属性 设置为 "authorization" 时我做错了什么(如果有的话)?如何正确设置身份验证 header?
2) 如果这是 HttpURLConnection 的错误,我该如何提交错误报告?
谢谢。
编辑:建议切换自:
conn.setRequestProperty("Authorization", authHeader);
至:
conn.addRequestProperty("Authorization", authHeader);
这没有解决问题。它仍然抛出相同的异常。
编辑:
仍然不确定 "Authorization" 和 "authorization" 导致 fileNotFounExceptions 的原因,但使用全部大写似乎可以正常工作。这是闪亮的新工作代码:
conn.setRequestProperty("AUTHORIZATION",authHeader);
所以看起来需要全部大写。 "HTTP_"会自动加到这个header前面,所以服务器看到的header是"HTTP_AUTHORIZATION",这是应该的。
这是我设置授权的 OAuth 代码的一部分 header:
httpUrlConnection.setUseCaches(false);
httpUrlConnection.setRequestProperty("User-Agent", "MyAgent");
httpUrlConnection.setConnectTimeout(30000);
httpUrlConnection.setReadTimeout(30000);
String baseAuthStr = APIKEY + ":" + APISECRET;
httpUrlConnection.addRequestProperty("Authorization", "Basic " + baseAuthStr);
httpUrlConnection.addRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
httpUrlConnection.connect();
我正在尝试使用基本身份验证连接到我的服务器,但是当我设置授权时 header,它导致 getInputStream 抛出 fileNotFound 异常。
相关代码如下:
URL url = new URL(myurl);
//set up the connection
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);//this is in milliseconds
conn.setConnectTimeout(15000);//this is in milliseconds
String authHeader = getAuthHeader(userID,pass);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setRequestProperty("authorization", authHeader);
//starts the query
conn.connect();
int response = conn.getResponseCode();
is = conn.getInputStream(); //throws the fileNotFound exception
这是抛出的异常:
java.io.FileNotFoundException: http://<myIPaddress>/login/
奇怪的是,如果我尝试将请求 属性 设置为 "authorization" 或 [=51],我发现 fileNotFound 异常 仅 抛出=] 或该词的任何变体。如果我将它设置为 "content-type" 或 "authosodifjsodfjs" (随机字符串),它是 not 抛出,如下所示:
conn.setRequestProperty("content-type",authHeader)//no exception thrown
conn.setRequestProperty("authosodifjsodfjs",authHeader)//no exception thrown
如果我不设置此 header,我可以使用此代码连接到服务器并获得我期望的正确 access-denied 消息。 如果我使用 python 的 "requests" 模块,我也能够连接到服务器并正确登录,所以这不是服务器的问题。
所以我的问题如下:
1) 将请求 属性 设置为 "authorization" 时我做错了什么(如果有的话)?如何正确设置身份验证 header?
2) 如果这是 HttpURLConnection 的错误,我该如何提交错误报告?
谢谢。
编辑:建议切换自:
conn.setRequestProperty("Authorization", authHeader);
至:
conn.addRequestProperty("Authorization", authHeader);
这没有解决问题。它仍然抛出相同的异常。
编辑: 仍然不确定 "Authorization" 和 "authorization" 导致 fileNotFounExceptions 的原因,但使用全部大写似乎可以正常工作。这是闪亮的新工作代码:
conn.setRequestProperty("AUTHORIZATION",authHeader);
所以看起来需要全部大写。 "HTTP_"会自动加到这个header前面,所以服务器看到的header是"HTTP_AUTHORIZATION",这是应该的。
这是我设置授权的 OAuth 代码的一部分 header:
httpUrlConnection.setUseCaches(false);
httpUrlConnection.setRequestProperty("User-Agent", "MyAgent");
httpUrlConnection.setConnectTimeout(30000);
httpUrlConnection.setReadTimeout(30000);
String baseAuthStr = APIKEY + ":" + APISECRET;
httpUrlConnection.addRequestProperty("Authorization", "Basic " + baseAuthStr);
httpUrlConnection.addRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
httpUrlConnection.connect();