Android中提供了两种网络请求方式,一种是使用Apache的HttpClient,或者使用使用Java的HttpUrlConnection。本文主要介绍Httpclient.
使用HttpClient的一般步骤
- 使用DefaultHttpCLient类实例化一个HttpClient的实例。
- 创建HttpGet或者HttpPost对象,并将要访问的Url传入进去
- 使用httpclient对象执行HttpGet(HttpPost)对象,并得到相应的HttpResponse对象
通过HttpResponse接口getEntity方法,获得响应信息,再做进一步处理。
public void sendGetRequest(String url){
HttpClient httpClient = new DefaultHttpClient(defaultParams());
//创建HttpGet对象
HttpGet httpget = new HttpGet(url);
//添加头部
httpget.addHeader(“connection”,”Keep-Alive”);
//执行请求操作
HttpResponse response = httpClient.excute(httpget);
HttpEntity entity = response.getEntiry();
if(entiry!=null){
InputStream is = entity.getContent();
//解析结果
String result = convertStream2String(is);
is.close();
}
}public static HttpParams defaultParams(){
HttpParams mDefaultParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeOut(mDefaultParams,10000);
HttpConnectionParams.setSoTimeOut(mDefaultParams,15000);
HttpConnectionParam.setNoDelay(mDefaultParams,true);//关闭就连接检查的配置为false HttpConntionParams.setStaleCheckingEnable(mDfaultParams,false); //协议参数 HttpProtocalParams.setVersion(mDefaultsParams,HttpVersion.HTTP_1_1); //持续握手 HttpProtocolParams.setUseExpectionContinue(mdefaultParams,false); return mDefaultParams;
}
注意:使用HttpGet调用时,url的参数暴露在URL中。并且长度限制在2048个字符之内(HTTP1.1之后URL的长度才没有限制)。
HttpUrlConnection
引入HttpUrlConnetion的原因
HttpClient已经能够满足我们的需求,那么为什么还要用HttpUrlconnection呢? 这是因为在ANdorid2.2呢?这是因为在Android2.2版本之前,JttpClient用为较少的Bug,而HttpUrlConneciton一直存在令人讨厌的bug。例如:一个可读的InputStream调用close()方法时,就有可能导致连接池失效。因此在android2.2之前使用HttpClient是比较好的。而在Android2.2之后,使用HttpUrlConnection是比较明智的。它提供的压缩、缓存机制可以有效的减少网络访问。
public void sendRequest(String url) throws IOException{
InputStream is = null;
try{
URL newUrl = new URL(url);
HttpUrlConnection conn = (HttpUrlConnection)newUrl.openConnection();
//设置读取的超时时间
conn.setReadTimeOut(1000);
//设置连接的超时时间
conn.setConnectionTimeOut(1500);
//设置可读数据
conn.setDoInput(true);
//设置可传数据
conn.setDoOutPut(true);
//设置保持长连接
conn.setRequestProperties("connection","keep-Alive");
//设置请求方式
conn.setRequestMethod("POST");
//添加请求参数
List<NameValuePair> paramsList = new ArrayList<NameValuePair>();
/传入相应的键值对
paramsList.add(new BasicNameValuePair("username","mr.simple"));
paramsList.add(new BasicNameValuePair("pwd","mypwd"));
//将参数和连接进行关联
writeParams(conn.getOutStream(),paramsList);
//发起请求
conn.connect();
is = conn.getInputStream();
//获取请求结果
String result = converStream2String(is);
Log.e("","### 请求结果:" + result);
}finally{
if(is!=null){
is.close();
}
}
}
public void writeParams(OutPutStream out , List<NameValuePaire> paramsList){
StringBuilder sb = new StringBuilder();
for(NameValuePair pair: paramsList){
if(!TextUtils.isEmpty(sb)){
sb.append("&");
}
sb.append(URLEncoder.encode(pair.getName(),"utf-8"));
sb.append("=");
sb.append(URLEncoder.encode(pair.getValue(),"utf-8");
}
BufferedWriter bw = new BufferWriter(new OutpuStreamWriter(out,"utf-8"));
bw.write(sb.toString());
bw.flush();
bw.close();
}
注意:
* 使用HttpUrlConnection时需要注意,如果我们要添加参数,那么需要调用HttpUrlConeneciton对象的setDoOutput(true)方法来启动输出功能。不同的请求方式是通过HttpUrlConnection的setRequestMethod()来进行设置。
* 如果是get请求,一定不要在请求体中传入参数,否则会变为post请求。