package com.wei.study;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JOptionPane;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIUtils;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
/**
* 初学java,未有小成 --- httpClient4.jar包学习
* 看到别人针对12306网站用httpClient4做了外挂
* 很多工程中也引入了这个包
* 于是上网找了些资料,小小的学习了一下
* 使用httpClient4做个模拟登录
* @author ww
* @date 2012-1-12
* @version 1.0
*/
public class ImitateLogin {
public static void main(String[] args) throws ClientProtocolException, IOException, URISyntaxException {
Map<String, String> paramsMap = new HashMap<String, String>();
paramsMap.put("username", "wwei11155"); //百度登陆用户名
paramsMap.put("password", "252067756"); //百度登陆密码
String cookie = sendPost("https://passport.baidu.com/?login",paramsMap,null);
Map<String,String> headers = new HashMap<String,String>();
headers.put("Cookie",cookie);
String html = EntityUtils.toString(sendGet("http://passport.baidu.com/center",headers));
String regex = "<img id=\"pa:bPortrait\" src=\".+\".+/>";
html = getInfo(html,regex);
System.out.println(html);
JOptionPane.showMessageDialog(null, "<html><center>这是你设置的百度图像</center>"+html.replace(">", "")+"</html>");
html = html.substring(html.indexOf("http"), html.lastIndexOf("jpg")+3);
System.out.println(html);
saveImage("e:/1.jpg",html);
}
/**
* 使用post方式请求网站内容 示例 url "http://www.baidu.com/s?wd=玩味"
* @param url 为 "www.baidu.com"
* @param query 可写为 "/s"
* @param paramsMap 参数 即 wd=玩味 存入Map中 key=wd , value=玩味
* @param headers 请求头部信息 可将Cookie 放入其中
* @return String
* @throws ClientProtocolException
* @throws IOException
* @throws URISyntaxException
*/
public static String sendPost(String url,String query,Map<String, String> paramsMap,Map<String,String> headers) throws ClientProtocolException, IOException, URISyntaxException{
DefaultHttpClient httpClient = new DefaultHttpClient();
List<NameValuePair> params = new ArrayList<NameValuePair>();
if(paramsMap!=null){
for(String str : paramsMap.keySet()){
params.add(new BasicNameValuePair(str, paramsMap.get(str)));
}
}
URI uri = URIUtils.createURI("http", url, -1, query, URLEncodedUtils.format(params, "UTF-8"), null);
HttpPost httpPost = new HttpPost(uri);
if (headers != null) {
httpPost.setHeaders(assembHead(headers));
}
httpClient.getParams().setIntParameter("http.socket.timeout", 30000);
HttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
System.out.println(httpPost.getURI());
System.out.println(EntityUtils.toString(entity));
return assembCookies(httpClient.getCookieStore().getCookies());
}
/**
* 登陆 返回Cookie信息
* Cookie 个人理解
* 成功登陆某网站后 该网站返回给你一段加密的信息 它记录你的ID,密码 等等 相当一把钥匙
* 只该Cookie存在 再次访问该网站时 服务器如果取到了Cookie 就无需再登录了
* 由于我们是模拟登录并非真正的使用浏览器去登录 所以Cookie信息就没有保存在我们的计算机上
* 但我们只要把该信息放在下一次请求的请求头中 那么也就不用再次登录了
* @param url 需要请求的地址
* @param paramsMap 参数
* @param headers 头部信息
* @return String
* @throws ClientProtocolException
* @throws IOException
*/
public static String sendPost(String url,Map<String, String> paramsMap,Map<String,String> headers) throws ClientProtocolException, IOException{
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
List<NameValuePair> params = new ArrayList<NameValuePair>();
if(paramsMap!=null){
for(String str : paramsMap.keySet()){
params.add(new BasicNameValuePair(str, paramsMap.get(str)));
}
}
httpPost.setEntity(new UrlEncodedFormEntity(params));
if (headers != null) {
httpPost.setHeaders(assembHead(headers));
}
//设置超时时间
httpClient.getParams().setIntParameter("http.socket.timeout", 30000);
HttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
System.out.println(httpPost.getURI());
System.out.println(EntityUtils.toString(entity));
httpPost.abort();
return assembCookies(httpClient.getCookieStore().getCookies());
}
/**
* get方法
* HttpGet与HttpPost方法大致相同
* 操作中发现HttpGet没有setEntity这个方法
* 个人理解
* Http定义了与服务器交互的不同方法,最基本的方法有4种
* get post put delete 全称为资源描述符 它们相对应的操作可理解为
* 查 改 增 删
* 因为get方法 主要是像服务器上获取数据 而post是向服务器传送数据
* 而setEntity方法相当于是把Entity传送给服务器
* 所以post中有setEntity方法 get主要获取数据 所以就不需要了....
* @param url 请求地址
* @param headers 头部信息
* @return HttpEntity
* @throws ClientProtocolException
* @throws IOException
*/
public static HttpEntity sendGet(String url,Map<String,String> headers) throws ClientProtocolException, IOException{
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
if (headers != null) {
httpGet.setHeaders(assembHead(headers));
}
// 设置超时时间
httpClient.getParams().setIntParameter("http.socket.timeout", 30000);
HttpResponse response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
return entity;
}
/**
* 组装Cookies信息 返回出格式为 xxxx=xxxxxxx
* @param cookies
* @return String
*/
public static String assembCookies(List<Cookie> cookies){
StringBuffer sb = new StringBuffer();
for (Cookie cookie : cookies) {
sb.append(cookie.getName()).append("=").append(cookie.getValue()).append(";");
}
System.out.println(sb.toString());
return sb.toString();
}
/**
* 组装Header信息
* @param headers
* @return Header[]
*/
public static Header[] assembHead(Map<String, String> headers){
Header[] allHeader = new BasicHeader[headers.size()];
int i = 0;
for(String str:headers.keySet()){
allHeader[i] = new BasicHeader(str,headers.get(str));
i++;
}
return allHeader;
}
/**
* 正则查找
* 照葫芦画瓢
* @param content 要查找的字符串
* @param regex 正则表达式
* @return String
*/
public static String getInfo(String content,String regex){
String rs = null;
Pattern pattern = Pattern.compile(regex);
Matcher mat = pattern.matcher(content);
if(mat.find()){
rs = mat.group();
}
return rs;
}
/**
* 保存图片到本地
* @param pathname 本地地址
* @param url 网络地址
* @throws IOException
*/
public static void saveImage(String pathname,String url) throws IOException{
FileOutputStream fos = new FileOutputStream(new File(pathname));
InputStream is = sendGet(url, null).getContent();
int temp = 0;
while((temp=is.read())!=-1){
fos.write(temp);
}
is.close();
fos.close();
}
}
/**
* 初学JAVA,未有小成;开源学习,多多交流!
* weiwei5910@vip.qq.com
*/
分享到:
相关推荐
httpclient-4.5所需jar包,里面包含httpclient-4.5.jar等等10个必须的开发包。 1.commons-codec-1.9.jar 2.commons-logging-1.2.jar 3.fluent-hc-4.5.jar 4.httpclient-4.5.jar 5.httpclient-cache-4.5.jar 6....
用java代码实现访问后台接口数据,传输的是json,为实现这一功能所用的jar包 一共有11个jar包 httpclient-4.5.12.jar httpcore-4.4.13.jar为较新的版本 commons-beanutils-1.7.0.jar commons-collections-3.1.jar ...
本文将深入探讨httpclient.jar包,以及它与code.jar包的关系,帮助开发者更好地理解和使用这两个组件。 httpclient.jar是Apache HttpClient库的核心组件,它提供了全面的HTTP协议支持,包括HTTP/1.1和部分HTTP/2。...
标题中的"commons-httpclient3.1.jar,commons-codec1.3.jar,commons-logging1.1.1.jar"指的是三个关键的Java库文件,它们是Apache HttpClient项目的一部分,用于在Java应用程序中实现HTTP通信。这些JAR(Java ...
wechatpay-apache-httpclient-0.2.1.jar
2013-11-21 15:31 292,890 httpclient-4.0.2.jar 2017-12-20 12:08 351,132 httpclient-4.1.1.jar 2012-08-03 01:45 451,595 httpclient-4.1.2-sources.jar 2012-08-03 01:44 352,254 httpclient-4.1.2.jar 2012-08-...
httpclient-4.3.3.jar httpclient-cache-4.3.3.jar httpcore-4.3.2.jar httpmime-4.3.3.jar javabase64-1.3.1.jar json.jar json-lib-2.4-jdk15.jar jsoup_1.6.2_add.jar mysql-connector-java.5.1.7.jar sqljdbc4....
commons-httpclient-3.1.jar commons-lang-2.3.jar commons-logging-1.1.1.jar commons-collections-3.2.1.jar ezmorph-1.0.3.jar 如果不关联这些包,则会出现以下错误:java.lang.NoClassDefFoundError: ...
本文将深入探讨`httpclient-4.5.jar`这个包,以及它所依赖的相关jar包,帮助你更好地理解和使用这个强大的工具。 HTTPClient 4.5是Apache HttpClient项目的最新稳定版本,它提供了全面的HTTP协议支持,包括标准方法...
虽然`commons-httpclient-3.0.jar`是一个经典版本,但随着Java的发展,Apache社区已经推出了更现代的HttpClient 4.x系列,提供了更多改进和优化,如更好的线程安全、更丰富的API以及对HTTP/2的支持。因此,建议在新...
httpclient-4.5.2.jar httpcore-4.4.4.jar httpmime-4.5.2.jar jackson-annotations-2.7.0.jar jackson-core-2.7.3.jar jackson-databind-2.7.3.jar jaxb-api-2.3.0.jar lz4-1.3.0.jar slf4j-api-1.7.21.jar csvjdbc...
中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...
接下来是`httpclient-4.1.3.jar`,这是Apache HttpClient库的一个版本,用于处理HTTP通信。HttpClient提供了丰富的功能,如发起GET、POST等各种HTTP请求,处理响应,管理连接池,支持HTTPS,以及设置请求头和参数等...
httpclient-4.5.13-sources.jar
-->commons-httpclient-3.1.jar -->axis2-jaxws-1.6.1.jar -->spring.jar -->commons-logging-1.1.1.jar axis2 webservice client端jar包 -->axis2-kernel-1.6.1.jar -->axis2-adb-1.6.1.jar -->axiom-...
5个jar包,commons-codec-1.9.jar,commons-httpclient-3.1.jar,commons-logging-1.2.jar,httpclient-4.5.jar,httpcore-4.4.1.jar
赠送jar包:httpclient-4.5.13.jar; 赠送原API文档:httpclient-4.5.13-javadoc.jar; 赠送源代码:httpclient-4.5.13-sources.jar; 赠送Maven依赖信息文件:httpclient-4.5.13.pom; 包含翻译后的API文档:...
综上所述,升级到HttpComponents HttpClient 4.x是一个复杂的过程,涉及到对新API的深入学习,理解新的编程模型和网络编程的优化。升级的好处包括性能的提升、更好的错误处理机制以及对最新HTTP协议特性的支持。通过...
httpclient-4.5.6.jar, commons-codec-1.10.jar, commons-logging-1.2.jar , fluent-hc-4.5.6.jar, httpclient-cache-4.5.6.jar, httpclient-win-4.5.6.jar , httpcore-4.4.10.jar, httpmime-4.5.6.jar, jna-4.4.0....