`
weiwei5910
  • 浏览: 27607 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类

初学java,未有小成 --- httpClient4.jar包学习

阅读更多
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
 */


分享到:
评论
2 楼 jianfaith 2013-03-12  
返回的html代码  有乱码现象 
1 楼 zzzzterrybogard 2012-04-05  
楼主V5

相关推荐

    httpclient-4.5jar

    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....

    httpclient jar包11个.rar

    用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 ...

    commons-httpclient3.1.jar,commons-codec1.3.jar,commons-logging1.1.1.jar

    标题中的"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

    wechatpay-apache-httpclient-0.2.1.jar

    httpclient 4.X版本下载有的带源码包

    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所有jar

    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....

    dbeaver-driver-all-master.zip

    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...

    fastjson-1.1.15.jar httpclient-4.1.3.jar httpcore-4.1.4.jar

    接下来是`httpclient-4.1.3.jar`,这是Apache HttpClient库的一个版本,用于处理HTTP通信。HttpClient提供了丰富的功能,如发起GET、POST等各种HTTP请求,处理响应,管理连接池,支持HTTPS,以及设置请求头和参数等...

    httpclient-4.5.13-sources.jar

    httpclient-4.5.13-sources.jar

    使用json-lib-2.2.2-jdk15.jar所要用到的jar包

    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.jar包下载

    本文将深入探讨httpclient.jar包,以及它与code.jar包的关系,帮助开发者更好地理解和使用这两个组件。 httpclient.jar是Apache HttpClient库的核心组件,它提供了全面的HTTP协议支持,包括HTTP/1.1和部分HTTP/2。...

    完整的axis2 jar包包含实例.zip

    --&gt;commons-httpclient-3.1.jar --&gt;axis2-jaxws-1.6.1.jar --&gt;spring.jar --&gt;commons-logging-1.1.1.jar axis2 webservice client端jar包 --&gt;axis2-kernel-1.6.1.jar --&gt;axis2-adb-1.6.1.jar --&gt;axiom-...

    commons-httpclient-3.0.jar JAVA中使用HttpClient可以用到

    虽然`commons-httpclient-3.0.jar`是一个经典版本,但随着Java的发展,Apache社区已经推出了更现代的HttpClient 4.x系列,提供了更多改进和优化,如更好的线程安全、更丰富的API以及对HTTP/2的支持。因此,建议在新...

    HttpClient 3.x to HttpComponents HttpClient 4.x

    综上所述,升级到HttpComponents HttpClient 4.x是一个复杂的过程,涉及到对新API的深入学习,理解新的编程模型和网络编程的优化。升级的好处包括性能的提升、更好的错误处理机制以及对最新HTTP协议特性的支持。通过...

    commons-httpclient-3.1.jar,包内共5个资源

    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

    commons-codec-1.3.jar,commons-httpclient-3.1.jar,commons-logging-1.1.jar)

    2. **commons-httpclient-3.1.jar**:这是Apache HttpClient库的3.1版本。HttpClient是一个功能强大的HTTP客户端实现,支持各种HTTP协议特性,如HTTP/1.1、HTTPS、连接管理、重定向、认证等。在图片上传中,开发者...

    hadoop-2.10.0jar.zip

    包含hadoop平台Java开发的所有所需jar包,例如activation-1.1.jar apacheds-i18n-2.0.0-M15.jar apacheds-kerberos-codec-2.0.0-M15.jar api-asn1-api-1.0.0-M20.jar api-util-1.0.0-M20.jar asm-3.2.jar avro-1.7.7...

    HttpClient所需jar包(全) httpClient.4.13jar

    4. `httpclient-cache-4.x.x.jar`: 提供了HTTP缓存功能,可以提高重复请求的效率。 5. `json-lib-2.x.x.jar`: 如果包含,这就是用于处理JSON数据的库。 6. 可能还有其他依赖库,如`commons-logging-*.jar`用于日志...

    Java HttpClient 全部的jar包

    5. `httpclient-4.x.x.jar`: 这是HttpClient的核心库,包含了所有HTTP协议相关的类和方法,如创建HTTP请求、设置请求头、处理响应、管理连接池等。 6. `httpcore-4.x.x.jar`: Apache HttpCore是HttpClient的基础...

Global site tag (gtag.js) - Google Analytics