现在的网站越来越流行开放api了,看到java eye的api感觉挺简单的决定用apache的HttpClient试一下,没想到在认证就麻烦不断,经过摸索终于搞定了。后来搜索后发现两种方法论坛都有人做过了,在这就当是总结吧。
方法一:直接添加header验证,这中方式比较简单,代码如下
package apiTest;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
public class Test {
public static void main(String[] args) throws Exception {
DefaultHttpClient httpClient = new DefaultHttpClient();
//get请求
HttpGet httpGet = new HttpGet("http://api.iteye.com/api/auth/verify");
httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3 JavaEye API Client");
httpGet.addHeader("Authorization", "name:password");
//请求内容
HttpContext httpContext = new BasicHttpContext();
HttpResponse response = httpClient.execute(httpGet,httpContext);
HttpEntity httpEntity = response.getEntity();
StringBuffer sb = new StringBuffer();
InputStream is = httpEntity.getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));
String str = "";
while((str=br.readLine()) != null){
sb.append(str);
}
System.out.println("Code:"+response.getStatusLine().getStatusCode());
System.out.println("Content:"+sb.toString());
httpClient.getConnectionManager().shutdown();
}
}
其中name:password是base64encode加密后内容;User-Agent使用模拟的Chrome的,加上了 JavaEye API Client,不模拟一个浏览器会被认为是网络爬虫抓取;
方法二:使用HttpClient的验证方式
package apiTest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScheme;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.AuthState;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpContext;
public class Test {
public static void main(String[] args) throws Exception {
DefaultHttpClient httpClient = new DefaultHttpClient();
//认证
httpClient.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST,AuthScope.ANY_PORT), new UsernamePasswordCredentials("username", "password"));
//get请求
HttpGet httpGet = new HttpGet("http://api.iteye.com/api/auth/verify");
httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3 JavaEye API Client");
//请求内容
HttpContext httpContext = new BasicHttpContext();
BasicScheme basicAuth = new BasicScheme();
httpContext.setAttribute("preemptive-auth", basicAuth);
httpClient.addRequestInterceptor(new HttpRequestInterceptor(){
@Override
public void process(HttpRequest request, HttpContext context)throws HttpException, IOException {
AuthState authState = (AuthState) context.getAttribute(ClientContext.TARGET_AUTH_STATE);
// If no auth scheme avaialble yet, try to initialize it preemptively
if (authState.getAuthScheme() == null) {
AuthScheme authScheme = (AuthScheme) context.getAttribute("preemptive-auth");
CredentialsProvider credsProvider = (CredentialsProvider) context.getAttribute(ClientContext.CREDS_PROVIDER);
HttpHost targetHost = (HttpHost) context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
if (authScheme != null) {
Credentials creds = credsProvider.getCredentials(new AuthScope(targetHost.getHostName(),targetHost.getPort()));
if (creds == null) {
throw new HttpException("No credentials for preemptive authentication");
}
authState.setAuthScheme(authScheme);
authState.setCredentials(creds);
}
}
}
},0);
HttpResponse response = httpClient.execute(httpGet,httpContext);
HttpEntity httpEntity = response.getEntity();
StringBuffer sb = new StringBuffer();
InputStream is = httpEntity.getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));
String str = "";
while((str=br.readLine()) != null){
sb.append(str);
}
System.out.println("Code:"+response.getStatusLine().getStatusCode());
System.out.println("Content:"+sb.toString());
httpClient.getConnectionManager().shutdown();
}
}
其中的HttpRequestInterceptor直接使用的HttpClient中的例子
用到的jar在apache上都有下载,版本看截图:
经过抓包发现两种方法都是在请求中添加了Authorization: username:password
- 大小: 4.1 KB
分享到:
相关推荐
JavaEye可能是一个提供用户认证服务的平台,而API则提供了验证用户身份的功能。 以下是一个关于如何使用HttpClient调用JavaEye API的基本步骤: 1. **导入必要的库**:首先,你需要在项目中导入HttpClient相关的...
JavaEye的API使用帮助是一个针对JavaEye开发框架的详细指南,旨在帮助开发者更好地理解和应用这个框架。这个压缩包包含了三个文件:一个PDF文档,一个TXT文本文件,以及一个URL链接。接下来,我们将深入探讨JavaEye ...
JavaEye API 的简单封装主要基于 Java 的 HttpClient 库,提供了更方便、易用的接口来执行 HTTP 请求。HttpClient 是一个成熟的 Java 库,用于执行 HTTP 协议的客户端请求,而 JavaEyeClient 则是对这个库进行了一层...
javaeye被黑 大家看看
NULL 博文链接:https://ago520.iteye.com/blog/754087
20. AJAX技术:包括ExtJS基础教程和jQuery图片循环效果,展示了AJAX如何提升用户体验。 此外,文件还涉及到了软件开发和项目管理的话题,如面子驱动编程、创业公司项目管理的挑战等,这些都是开发者职业生涯中不容...
- **用途**:支持用户自定义标签的保存和操作。 **7. will_paginate** - **作用**:为Rails内置的分页功能提供更好的替代方案。 #### 五、文档与帮助资源 **1. fastri** - **功能**:加速 Ruby 文档查询的速度...
2. **Android SDK**:作为基于Android平台的应用,JavaEye Client SourceCode必然使用了Android SDK,包括Android API的各种类库,例如视图(View)和布局(Layout)系统,以及用于网络通信、数据库操作、文件I/O等...
javaeye的信息提示框代码之css,application.js
JavaEye+技术架构,讲述java框架的应用
而Android JavaEye客户端则是该社区为了满足移动用户需求,专门开发的一款应用程序,旨在让用户随时随地获取最新的技术资讯、参与讨论并分享自己的见解。本文将深入解析这个客户端,探讨其背后的技术实现以及对...
在现代浏览器中,由于Flash已逐渐被淘汰,可能需要使用其他技术(如clipboard API)来实现相同的功能。 要在WordPress中使用这些文件,你需要将它们上传到合适的目录,例如主题的`js`和`css`文件夹,并在主题的`...
这些技术资源为前端开发者提供了丰富的选择,有助于提升网页设计和用户体验。 最后,在社区和工具方面,JavaEye采访了资深会员,收集了他们对于行业趋势和未来技术发展的预测,展示了开源项目的介绍,如LForum for ...
在处理网络请求时,可能需要考虑多线程或异步处理,以提高应用程序的性能和用户体验。JavaEye客户端可能包含有关如何使用Java的Thread类或ExecutorService来执行并发请求的示例。 六、调试与日志记录 为了方便调试...
### Android中文API合集知识点概览 #### 一、引言 随着移动互联网的发展,Android作为全球最大的移动操作系统之一,在开发者社区中占据了重要的地位。为了帮助开发者更好地理解和使用Android的各种功能,Google提供...
NULL 博文链接:https://ago520.iteye.com/blog/814571