httpclient401tutorialWord文件下载.docx
- 文档编号:18364872
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:51
- 大小:51.07KB
httpclient401tutorialWord文件下载.docx
《httpclient401tutorialWord文件下载.docx》由会员分享,可在线阅读,更多相关《httpclient401tutorialWord文件下载.docx(51页珍藏版)》请在冰豆网上搜索。
//…..
}
1.1.1HTTPRequest(HTTP请求)
所有的HTTP请求有一个请求行包含一个方法名,请求URI和HTTP协议版本。
HttpClient支持在HTTP/1.1规范中定义的所有HTTP方法:
GET、HEAD、POST、PUT、DELETE,、TRACEandOPTIONS,用一些特殊的类来表示每一个方法:
HttpGet、HttpHead、HttpPost、HttpPut、HttpDelete、HttpTrace和HttpOptions。
HTTP请求URI的包括协议、主机名、可选的端口、资源的路径、可选的查询和可选的片段。
HttpGethttpget=newHttpGet(
"
HttpClient提供了一个实用的方法来简化创建和修改请求的URIs,URI可以由程序编程组装:
URIuri=URIUtils.createURI("
http"
"
"
-1,"
/search"
q=httpclient&
btnG=Google+Search&
aq=f&
oq="
null);
HttpGethttpget=newHttpGet(uri);
System.out.println(httpget.getURI());
输出:
查询字符串也可以从各个参数生成:
List<
NameValuePair>
qparams=newArrayList<
();
qparams.add(newBasicNameValuePair("
q"
httpclient"
));
btnG"
GoogleSearch"
aq"
f"
oq"
null));
URLEncodedUtils.format(qparams,"
UTF-8"
),null);
1.1.2HTTPResponse(HTTP响应)
HTTPResponse消息是由服务器发送回客户端,客户端接收并解释的请求消息。
该消息的第一行由协议版本、数字状态码和相关的简短文本构成。
HttpResponseresponse=newBasicHttpResponse(HttpVersion.HTTP_1_1,HttpStatus.SC_OK,"
OK"
System.out.println(response.getProtocolVersion());
System.out.println(response.getStatusLine().getStatusCode());
System.out.println(response.getStatusLine().getReasonPhrase());
System.out.println(response.getStatusLine().toString());
HTTP/1.1
200
OK
HTTP/1.1200OK
1.1.3Workingwithmessageheaders(处理头部消息)
HTTP信息可以包含一系列头部描述消息的属性,例如:
内容长度,内容类型等等。
HttpClient提供方法检索、添加、删除、列举头部信息。
response.addHeader("
Set-Cookie"
c1=a;
path=/;
domain=localhost"
c2=b;
path=\"
/\"
c3=c;
domain=\"
localhost\"
Headerh1=response.getFirstHeader("
System.out.println(h1);
Headerh2=response.getLastHeader("
System.out.println(h2);
Header[]hs=response.getHeaders("
System.out.println(hs.length);
Set-Cookie:
c1=a;
domain=localhost
c2=b;
path="
/"
domain="
localhost"
2
最有效的方法来获得给定类型的所有头部信息是利用HeaderIterator接口。
HeaderIteratorit=response.headerIterator("
while(it.hasNext()){
System.out.println(it.next());
它还提供了便利的方法把HTTP消息解析成单独的头部信息元素。
HeaderElementIteratorit=newBasicHeaderElementIterator(response.headerIterator("
HeaderElementelem=it.nextElement();
System.out.println(elem.getName()+"
="
+elem.getValue());
NameValuePair[]params=elem.getParameters();
for(inti=0;
i<
params.length;
i++){
System.out.println("
+params[i]);
}
c1=a
path=/
domain=localhost
c2=b
c3=c
1.1.4HTTPentity(HTTP实体)
HTTP消息能传输内容实体的请求或响应,在一些请求和响应中可以发现实体,因为它们是可选的。
HTTP规范定义了两个实体包装的方法:
POST和PUT,响应通常附上内容实体。
HttpClient根据内容来源区分了三种不同类型的实体:
●Streamed:
内容是从流接收或产生的,特别是,这类实体是从HTTP响应中接收,流媒体通常是不可重复的。
●self-contained:
内容是在内存中或者从独立的一个连接或其它实体中获得,self-contained实体通常是重复的。
●wrapping:
内容从另一个实体获得。
1.1.4.1Repeatableentities(可重复的实体)
一个实体可以是可重复的,这意味着它的内容可以被读取一次以上。
这是唯一可能有自我包含的实体(像ByteArrayEntity或StringEntity)。
1.1.4.2UsingHTTPentities(使用HTTP实体)
由于一个实体即能表示二进制内容又能表示字符内容,它支持字符编码(支持后者,即:
字符内容)。
从实体中读取内容,通过HttpEntity的getContent方法可以取回输入流,并返回一个java.io.InputStream,或者给HttpEntity的writeTo(OutputStream)方法提供一个输出流,它将一次性返回所有的被写在流里的内容。
当实体已收到传入消息,HttpEntity#getContentType()和HttpEntity#getContentLength()方法可用于读取常见的元数据,例如内容类型和内容长度(如果可用)。
由于内容类型标题可以包含文本MIME类型的字符编码,像text/plain或者text/html,HttpEntity#getContentEncoding()方法用来读取此信息。
如果标题不可用,返回的长度为-1,并返回内容类型为NULL,如果内容类型标题可用,返回标题对象。
当创建一个即将卸任的消息实体,此元数据必须由实体创建者提供。
StringEntitymyEntity=newStringEntity("
importantmessage"
System.out.println(myEntity.getContentType());
System.out.println(myEntity.getContentLength());
System.out.println(EntityUtils.getContentCharSet(myEntity));
System.out.println(EntityUtils.toString(myEntity));
System.out.println(EntityUtils.toByteArray(myEntity).length);
Content-Type:
text/plain;
charset=UTF-8
17
UTF-8
importantmessage
1.1.5Ensuringreleaseoflowlevelresources(确保底层资源的释放)
当响应实体完成时,重要的是要确保所有的实体内容已被完全销毁,使该连接可以安全地返回到连接池,由以后的请求重复利用连接管理器,最简单的方法是调用HttpEntity#consumeContent()方法来消毁任何可用的流内容。
HttpClient一旦检测到流的末尾的内容已经到达,就自动释放基础连接返回到连接管理器。
HttpEntity#consumeContent()方法安全的调用一次以上。
调用HttpUriRequest#abort()方法可以简单地终止请求。
InputStreaminstream=entity.getContent();
intbyteOne=instream.read();
intbyteTwo=instream.read();
//Donotneedtherest
httpget.abort();
该连接将不被重用,底层的资源将正确地释放。
1.1.6Consumingentitycontent(销毁实体内容)
推荐的方法消耗的实体内容是通过使用其HttpEntity#getContent()或HttpEntity#writeTo(OutputStream中)方法。
HttpClient的还配备了EntityUtils类,它暴露了一些静态方法能够更容易地从一个实体读取内容或信息。
而不是直接读取java.io.InputStream,使用这个类的方法可以取回string/bytearray整个内容体,然而,EntityUtils不鼓励使用,除非实体响应来自一个可信赖的HTTP服务器和已知的有限长度。
longlen=entity.getContentLength();
if(len!
=-1&
&
len<
2048){
System.out.println(EntityUtils.toString(entity));
}else{
//Streamcontentout
在某些情况下,它可能需要能够读取实体内容超过一次,在这种情况下实体的内容必须以某种方式被缓冲,无论是在内存或磁盘上。
最简单的方法是通过包装原始的BufferedHttpEntity类来完成。
这将导致原始的实体内容读入内存中的缓冲区。
entity=newBufferedHttpEntity(entity);
1.1.7Producingentitycontent(产生实体内容)
HttpClient提供了常见的数据容器,例如字符串、字节数组、输入流和文件:
StringEntity,ByteArrayEntity,InputStreamEntity和FileEntity。
Filefile=newFile("
somefile.txt"
FileEntityentity=newFileEntity(file,"
text/plain;
charset=\"
UTF-8\"
HttpPosthttppost=newHttpPost("
//localhost/action.do"
httppost.setEntity(entity);
请注意InputStreamEntity是不可重复的,因为它只能从底层流中读取数据一次。
一般来说,建议实现自定义HttpEntity类,而不是使用通用InputStreamEntity。
FileEntity可以是一个很好的起点。
1.1.7.1Dynamiccontententities(动态的内容实体)
通常的HTTP实体需要动态生成一个特定的执行上下文,HttpClient提供了ContentProducer接口和EntityTemplate实体类支持动态实体。
内容的生产者通过写出来到一个输出流产生他们的需求内容。
因此,与EntityTemplate创建实体,一般是自给自足,重复性好。
ContentProducercp=newContentProducer(){
publicvoidwriteTo(OutputStreamoutstream)throwsIOException{
Writerwriter=newOutputStreamWriter(outstream,"
writer.write("
<
response>
<
content>
importantstuff"
/content>
/response>
writer.flush();
};
HttpEntityentity=newEntityTemplate(cp);
//localhost/handler.do"
1.1.7.2HTMLforms(HTML表单)
许多应用程序经常需要模拟的提交的HTM表单的过程,例如,按顺序登录到Web应用程序或提交的输入数据,HttpClient提供特殊的实体类UrlEncodedFormEntity减轻了处理的困难。
formparams=newArrayList<
formparams.add(newBasicNameValuePair("
param1"
value1"
param2"
value2"
UrlEncodedFormEntityentity=newUrlEncodedFormEntity(formparams,"
这UrlEncodedFormEntity实例将调用URL编码对参数进行编码,并产生以下内容:
param1=value1&
param2=value2
1.1.7.3Contentchunking(内容组块)
一般来说,建议让HttpClient基于HTTP消息的属性传输选择最合适的传输编码,这是可能的,然而,真正的HttpClient通知该组块编码的,是首选的设置HttpEntity#setChunked()为true。
请注意的HttpClient将使用该标志,当使用HTTP协议版本不支持组块编码时,这个值被忽略,例如:
HTTP/1.0协议。
StringEntityentity=newStringEntity("
entity.setChunked(true);
//localhost/acrtion.do"
1.1.8Responsehandlers(响应处理器)
最简单和最方便的方式来处理的响应是使用ResponseHandler接口。
这种方法完全缓解连接管理,用户不必担心。
当使用ResponseHandler的HttpClient会自动采取异常谨慎,确保释放连接返回到连接管理器,无论是否成功或异常原因。
ResponseHandler<
byte[]>
handler=newResponseHandler<
(){
publicbyte[]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- httpclient401tutorial