`
w7849516230
  • 浏览: 18486 次
文章分类
社区版块
存档分类
最新评论

Java处理http协议相关初步(一)——httpclient

 
阅读更多
老是看了就忘,实在是不行啊,还是都一点一点记下来,帮着自己也帮着初学者吧。白话的描述自己的过程。首先说明的是这个用来做什么:处理http(超文本传输协议)报文,就是可以作为客户端,从网上获取个天气,手机归属地查询等等信息,或是模拟个网页上自动登录之类;或者作为服务端,提供特定URI上的响应。理解的不太好请谅解,下面开始:
HTTP协议是一种请求-应答式的协议:客户端发送一个请求,服务器返回该请求的回答,请求与应答都是http包,当然,是基于可靠地TCP连接的,端口默认是80;根据http协议,作为客户端可以对连接进行管理,而且HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系,那么状态的维护就需要其它方式,比如cookies;同样,作为服务端对于客户端连接请求及相应的状态维护需要进行处理。因此,这里就介绍作为处理http报文的客户端httpclient和可以作为简单服务端的httpserver。需要进一步说明的是httpclient是apache下的基于HttpCore的客户端HTTP运输实现库,提供了比java.net所具有的通过http访问资源更全面和灵活的功能。而httpserver是jdk6下,开放的不是太多的类库。
这里写几篇,最后想实现PC上一个服务端,PC的客户端和Android手机通过Wi-Fi链接PC的客户端,访问服务端,而这里面的具体功能就看情况啦,传个文件?如果是视频就美啦,想想而已。先说httpclient。(专业的官方教程翻译文档可以去下面链接下载)
首先明确的是httpclient最重要的功能是执行HTTP方法,但它不是一个浏览器。它是一个客户端的 HTTP 通信实现库。HttpClient 的目标是发送和接收 HTTP 报文。HttpClient 不会去缓存内容,不会执行嵌入在 HTML 页面中的 javascript 代码,猜测内容类型,重新格式化请求/重定向 URI,或者其它和 HTTP运输无关的功能。(摘自翻译的文档,后面很多也是)。
(1)请求
HTTP请求包,HttpClient支持所有定义在HTTP/1.1版本中的HTTP方法: GET, HEAD, POST, PUT, DELETE,TRACE 和OPTIONS。 对于每个方法类型都有一个特殊的类: HttpGet, HttpHead, HttpPost,HttpPut,HttpDelete,HttpTrace 和 HttpOptions。 请求的 URI 是统一资源定位符,它标识了应用于哪个请求之上的资源。HTTP 请求 URI包含一个协议模式,主机名称,可选的端口,资源路径,可选的查询和可选的片段。
请求包由三个部分构成,分别是:方法名-URI-协议/版本,请求头,请求正文。下面是一个HTTP请求包(GET)的例子:
GET /index.jsp HTTP/1.1
Accept-Language: zh-cn
Connection: Keep-Alive
Host: 192.168.0.106
Content-Length: 37
userName=new_andy&password=new_andy
可以对照着理解,最后一行为正文,正文与HTTP头部有一个空行(/r/n)分隔
(2)响应
HTTP 响应是由服务器在接收和解释请求报文之后返回发送给客户端的报文。响应报文的第一行包含了协议版本,之后是数字状态码和相关联的文本段,简单来说分别是:协议-状态代码-描述,应答头,应答正文。看个例子
HTTP/1.1 200 OK
Date: Sun, 15 Apr 2012 04:27:07 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 156
好了,我们可以看个获取手机号归属地等相关信息的例子
package com.test.myjava;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;

import org.apache.http.*;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public class HttpClientTest {
	public static void main(String[] args) throws IOException,
			URISyntaxException {
		HttpClient httpclient = new DefaultHttpClient();
		//设置URI,也可以在Get的Parameters中设置
		URI uri = URIUtils.createURI("http", "vip.showji.com/", -1,
				"locating/", "m=手机号&outfmt=json", null);
		HttpGet httpGet = new HttpGet(uri);
		HttpResponse response = httpclient.execute(httpGet);
		//获取响应头信息
		String headString = null;
		HeaderIterator headItr = response.headerIterator(null); 
		while(headItr.hasNext()){
			System.out.println(headItr.next().toString());
		}
		//获取内容实体信息
		HttpEntity entity = response.getEntity();
		if (entity != null) {
			InputStream instream = entity.getContent();
			System.out.println(EntityUtils.toString(entity));
		}
	}
}

写的时候,发现真的是不清不楚,太丢人,权当开了个理解的口子吧。这个是从 hao123 网站上找的链接,然后把表单需要的数据找出来用的,不保证一直有效。里面的手机号换成自己的啊。

参考:

官方教程翻译:http://download.csdn.net/detail/w7849516230/4227117

HttpClient入门:http://www.ibm.com/developerworks/cn/opensource/os-httpclient/



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics