java小白日记1--http请求添加Authorization验证
2013-12-16 17:15
549 查看
接触java一年有余,如今第一次动手写相关博客。以往都是在各为前辈的文章里寻求帮助,现在我来分享一些自己遇到的问题。
问题的经过是这样,我写的一个小程序要去公司的一台服务器上抓取一个页面数据,这台服务器前段时间因为故障重启了一下,不知为何再去抓取的时候会报io异常,信息代码401,在网上查了一下,是需要Authorization验证。和同事问到了验证的用户密码,但是不知道怎样在请求时添加认证信息。查API,翻来翻去只发现应该是通过 HttpURLConnection 的 setRequestProperty(String key, String value) 方法来实现,但不知道 key 和 value 分别应该怎么写。终于,去谷歌(思维习惯要改啊)……
那么,解决方法如下:
关键代码:
String authString = user + ":" + password;
byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
String authStringEnc = new String(authEncBytes);
connection.setRequestProperty("Authorization", "Basic " + authStringEnc);
其中 Base64.encodeBase64(authString.getBytes()); 需要用到 commons-codec.jar 包
完整的下载代码如下
public String DownloadFromUrl(String urlstr,String code,String user,String password) throws MalformedURLException{
StringBuilder data = new StringBuilder();
URL url = new URL(urlstr);
int counts = 0;
while(true){
try {
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
String authString = user + ":" + password;
// System.out.println("auth string: " + authString);
byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
String authStringEnc = new String(authEncBytes);
connection.setRequestProperty("Authorization", "Basic " + authStringEnc);
// System.out.println("Base64 encoded auth string: " + authStringEnc);
connection.setRequestProperty("User-Agent", "MSIE 7.0");
connection.setConnectTimeout(5000);
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), code));
String line = null;
while ((line = br.readLine()) != null) {
data.append(line);
data.append("\r\n");
}
connection.disconnect();
break;
} catch (ConnectException e) {
if(counts >=5){
System.out.println(urlstr+" : "+e.toString());
// e.printStackTrace();
return null;
}
counts++;
System.out.println("再次尝试");
continue;
} catch (Exception e) {
if(counts >=5){
System.out.println(urlstr+" : "+e.toString());
// e.printStackTrace();
return null;
}
counts++;
System.out.println("再次尝试");
continue;
}
}
return data.toString();
}
问题的经过是这样,我写的一个小程序要去公司的一台服务器上抓取一个页面数据,这台服务器前段时间因为故障重启了一下,不知为何再去抓取的时候会报io异常,信息代码401,在网上查了一下,是需要Authorization验证。和同事问到了验证的用户密码,但是不知道怎样在请求时添加认证信息。查API,翻来翻去只发现应该是通过 HttpURLConnection 的 setRequestProperty(String key, String value) 方法来实现,但不知道 key 和 value 分别应该怎么写。终于,去谷歌(思维习惯要改啊)……
那么,解决方法如下:
关键代码:
String authString = user + ":" + password;
byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
String authStringEnc = new String(authEncBytes);
connection.setRequestProperty("Authorization", "Basic " + authStringEnc);
其中 Base64.encodeBase64(authString.getBytes()); 需要用到 commons-codec.jar 包
完整的下载代码如下
public String DownloadFromUrl(String urlstr,String code,String user,String password) throws MalformedURLException{
StringBuilder data = new StringBuilder();
URL url = new URL(urlstr);
int counts = 0;
while(true){
try {
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
String authString = user + ":" + password;
// System.out.println("auth string: " + authString);
byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
String authStringEnc = new String(authEncBytes);
connection.setRequestProperty("Authorization", "Basic " + authStringEnc);
// System.out.println("Base64 encoded auth string: " + authStringEnc);
connection.setRequestProperty("User-Agent", "MSIE 7.0");
connection.setConnectTimeout(5000);
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), code));
String line = null;
while ((line = br.readLine()) != null) {
data.append(line);
data.append("\r\n");
}
connection.disconnect();
break;
} catch (ConnectException e) {
if(counts >=5){
System.out.println(urlstr+" : "+e.toString());
// e.printStackTrace();
return null;
}
counts++;
System.out.println("再次尝试");
continue;
} catch (Exception e) {
if(counts >=5){
System.out.println(urlstr+" : "+e.toString());
// e.printStackTrace();
return null;
}
counts++;
System.out.println("再次尝试");
continue;
}
}
return data.toString();
}
相关文章推荐
- Android中利用HttpURLConnection发送Post请求并添加参数的写法
- 在xcode7中进行http网络请求 需要添加字段
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
- svc 报“由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。“的HTTP 错误 404.3 – Not Found
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
- Android Retrofit2&OkHttp3添加统一的请求头Header
- React-Native 在iOS9之后,网络请求默认为Https请求,如需支持Http,修改info.plist文件添加键值对设置允许http访问。
- svc 报“由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。“的HTTP 错误 404.3 – Not Found
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
- HTTP 错误 404.3 – Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
- svc 报“由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。“的HTTP 错误 404.3 – Not Found
- 关于请求添加HttpRequestHeader
- Http请求通过线程添加超时处理
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
- WCF HTTP 错误 404.3 - Not Found(由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。)
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
- 如何在Android应用里对HTTP请求头部添加适当的User-Agent字段
- HTTP 请求方式: GET和POST的比较当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。
- jmeter实现根据http请求参数是否有值,选择性的添加参数
- Android Retrofit2&OkHttp3添加统一的请求头Header