一个HTTP方法的执行可以包含一个或多个HTTP请求/HTTP响应交换,通常由HttpClient的内部来处理。而期望用户提供一个要执行的请求对象,而HttpClient期望传输请求到目标服务器并返回对应的响应对象,或者当执行不成功时抛出异常。
案例代码:importjava.io.InputStream;
importorg.apache.http.HttpEntity;
importorg.apache.http.HttpResponse;
importorg.apache.http.client.HttpClient;
importorg.apache.http.client.methods.HttpGet;
importorg.apache.http.impl.client.DefaultHttpClient;
publicclassHttpClientDemo{
/**
*@paramargs
*@throwsException
*/
publicstaticvoidmain(String[]args)throwsException{
//1、创建HttpClient客户端类
HttpClienthttpclient=newDefaultHttpClient();
//2、创建GET请求类
HttpGethttpget=newHttpGet("/");
//3、执行GET请求
HttpResponseresponse=httpclient.execute(httpget);
//4、获取执行返回结果
HttpEntityentity=response.getEntity();
//5、打印执行结果输出内容
if(entity!=null){
InputStreaminstream=entity.getContent();
intl;
byte[]bytes=newbyte[2048];
while((l=instream.read(bytes))!=-1){
Stringhtml=newString(bytes,0,l,"utf-8");
System.out.println(html);
}
}
}
}
所有HTTP请求有一个组合了的方法名,请求URI和HTTP协议版本的请求行。
HttpClient支持所有定义在HTTP/1.1版本中的HTTP方法:GET,HEAD,POST,PUT,DELETE,TRACE和OPTIONS。对于每个方法类型都有一个特殊的类:HttpGet,HttpHead,HttpPost,HttpPut,HttpDelete,HttpTrace和HttpOptions。
请求URI的使用:
请求的URI是统一资源定位符,它标识了应用于哪个请求之上的资源。HTTP请求URI包含一个协议模式,主机名称,可选的端口,资源路径,可选的查询和可选的片段。
完成拼接URL:Stringurl="/s"+
"?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu";
HttpGethttpget=newHttpGet(url);
System.out.println(httpget.getURI());
URIUtils类来拼装:URIuri=URIUtils.createURI("http","",-1,"/s",
"ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu",null);
HttpGethttpget=newHttpGet(uri);
System.out.println(httpget.getURI());
NameValuePair生成:Listqparams=newArrayList();
qparams.add(newBasicNameValuePair("ie","utf-8"));
qparams.add(newBasicNameValuePair("f","8"));
qparams.add(newBasicNameValuePair("rsv_bp","0"));
qparams.add(newBasicNameValuePair("rsv_idx","1"));
qparams.add(newBasicNameValuePair("tn","baidu"));
URIuri=URIUtils.createURI("http","",-1,"/s",
URLEncodedUtils.format(qparams,"UTF-8"),null);
HttpGethttpget=newHttpGet(uri);
System.out.println(httpget.getURI());
输出:
/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu
HTTP响应://HTTP1.1响应
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响应是由服务器在接收和解释请求报文之后返回发送给客户端的报文。响应报文的第一行包含了协议版本,之后是数字状态码和相关联的文本段。
HTTP协议头:
一个HTTP报文可以包含很多描述如内容长度,内容类型等信息属性的头部信息。HttpResponseresponse=newBasicHttpResponse(HttpVersion.HTTP_1_1,
HttpStatus.SC_OK,"OK");
response.addHeader("Set-Cookie","c1=a;path=/;domain=localhost");
response.addHeader("Set-Cookie","c2=b;path=\"/\",c3=c;domain=\"localhost\"");
Headerh1=response.getFirstHeader("Set-Cookie");
System.out.println(h1);
Headerh2=response.getLastHeader("Set-Cookie");
System.out.println(h2);
Header[]hs=response.getHeaders("Set-Cookie");
System.out.println(hs.length);
获得给定类型的所有头部信息最有效的方式是使用HeaderIterator接口。HttpResponseresponse=newBasicHttpResponse(HttpVersion.HTTP_1_1,
HttpStatus.SC_OK,"OK");
response.addHeader("Set-Cookie",
"c1=a;path=/;domain=localhost");
response.addHeader("Set-Cookie",
"c2=b;path=\"/\",c3=c;domain=\"localhost\"");
HeaderIteratorit=response.headerIterator("Set-Cookie");
while(it.hasNext()){
System.out.println(it.next());
}
解析HTTP报文到独立头部信息元素的方法方法。//HttpResponse对象
HttpResponseresponse=newBasicHttpResponse(HttpVersion.HTTP_1_1,
HttpStatus.SC_OK,"OK");
response.addHeader("Set-Cookie","c1=a;path=/;domain=localhost");
response.addHeader("Set-Cookie",
"c2=b;path=\"/\",c3=c;domain=\"localhost\"");
//遍历
HeaderElementIteratorit=newBasicHeaderElementIterator(response
.headerIterator("Set-Cookie"));
while(it.hasNext()){
HeaderElementelem=it.nextElement();
System.out.println(elem.getName()+"="+elem.getValue());
NameValuePair[]params=elem.getParameters();
for(inti=0;i
System.out.println(""+params[i]);
}
}