注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

android中进行http健壮编程  

2010-06-24 14:04:41|  分类: Android网络 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http健壮编程
对于Http请求主要有四部分需要处理:
一,创建HttpClient,可以在创建时传参数,来设置连接的一些信息。比如超时时间等
如:
 private DefaultHttpClient getClient()
 {
  BasicHttpParams params= new BasicHttpParams();
  HttpConnectionParams.setConnectionTimeout(params, 20*1000);
  HttpConnectionParams.setSoTimeout(params, 20*1000);
  HttpConnectionParams.setSocketBufferSize(params, 10*1024);
  DefaultHttpClient client=new DefaultHttpClient(params);
  return client;
 }
二,设置授权。
  DefaultHttpClient client=getClient();
  if((user!=null)&&password!=null)
  {
   UsernamePasswordCredentials credential=new UsernamePasswordCredentials(user,password);
   client.getCredentialsProvider().setCredentials(AuthScope.ANY, 
     credential);
  }
HttpClient支持各种方案,包括基本身份验证,摘要式身份验证和特定于Windows的NTLM方案。
默认采用基本身份验证方案,它使用简单的用户名和密码。这里采用的是基本身份验证方案。
(另外,如果需要可以为基于表单的身份验证使用强先式登录方案------只提交需要表单并获取令牌或会话ID等)
注意:这里的范围是AuthScope.ANY,它是个AuthScope对象,我们可以创建个性化的AuthScope对象。
具体可参照http://developer.android.com/reference/org/apache/http/auth/AuthScope.html
三,HTTP头信息。
HTTP头信息可以在拦截器HttpRequestInterceptor中添加。
如:
  if(requestType==POST_TYPE)
  {
   sendHeaders.put(CONTENT_TYPE, contentType);
  }
  if(sendHeaders.size()>0)
  {
   HttpRequestInterceptor itcp=new HttpRequestInterceptor()
   {
   public void process(HttpRequest request, HttpContext context)
   throws HttpException,IOException
   {
    for(String key:sendHeaders.keySet())
    {
     if(!request.containsHeader(key))
     {
      request.addHeader(key,sendHeaders.get(key));
     }
    }
   } 
   };
   client.addRequestInterceptor(itcp);
  }
注意1:关于拦截器HttpRequestInterceptor的更多内容参考《请求拦截器HttpRequestInterceptor》
注意2:关于HTTP头信息的详细信息请参阅《HTTP头信息》
四,设置要发送的数据。
对于POST是这样
  if(requestType==POST_TYPE)
  {
   HttpPost method=new HttpPost(url);
   List<NameValuePair> nvps=null;
   if((params!=null)&&(params.size()>0))
   {
    nvps=new ArrayList<NameValuePair>();
    for(String key:params.keySet())
    {
     nvps.add(new BasicNameValuePair(key,params.get(key)));
    }
   }
   if(nvps!=null)
   {
    try
    {
     method.setEntity(new UrlEncodedFormEntity(nvps,HTTP.UTF_8));
    }catch(UnsupportedEncodingException e)
    {
     
    }
   }
   execute(client,method);
  }
对于GET只要把要发送的数据加到url中
如:
  else if(requestType==GET_TYPE)
  {
   String paramStr="";
   for(String key:params.keySet())
   {
    paramStr=paramStr+"&"+key+"="+params.get(key);
   }
   paramStr=paramStr.replaceFirst("&", "?");
   url+=paramStr;
   HttpGet method=new HttpGet(url);
   execute(client,method);
  }
五,执行Http处理请求并设置返回处理程序。
如:
client.execute(method,responseHandler);
注意:
也可以不设置返回处理程序,
如:
HttpResponse response)=client.execute(method);
六,处理返回信息:
 ResponseHandler<String> MyResponseHandler=new ResponseHandler<String>()
 {
  public String handleResponse(final HttpResponse response)
  {
   Message message=handler.obtainMessage();
   Bundle bundle=new Bundle();
   StatusLine status=response.getStatusLine();
   HttpEntity entity=response.getEntity();
   String result=null;
   InputStream is;
   if(entity!=null)
   {
    try
    {
     is=entity.getContent();
     byte buffer[]=new byte[is.available()];
     is.read(buffer);
     result=new String(buffer);
     bundle.putString("RESPONSE", result);
     message.setData(bundle);
     message.what=SUCCESS;
     handler.sendMessage(message);
     
    }
    catch(IOException e)
    {
     bundle.putString("RESPONSE", "Error - "+status.getReasonPhrase());
     message.setData(bundle);
     handler.sendMessage(message);     
    }
   }else
   {
    bundle.putString("RESPONSE", "Error - "+status.getReasonPhrase());
    message.setData(bundle);
    handler.sendMessage(message);
   }
   return result;
  }
 };
实例1:
HttpRequestHelper.java
package com.teleca.Socket;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.NameValuePair;
import org.apache.http.ProtocolVersion;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
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.methods.HttpRequestBase;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHttpResponse;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpContext;
import android.util.Log;
public class HttpRequestHelper {
private static final int POST_TYPE=1;
private static final int GET_TYPE=2;
private static final String CONTENT_TYPE="Content-Type";
public static final String MIME_FORM_ENCODEED="application/X-WWW-form-unlencoded";
public static final String MIME_TEXT_PLAIN="text/plain";
private final ResponseHandler<String> responseHandler;
private String tag="hubin";
 public HttpRequestHelper(ResponseHandler<String > responseHandler)
 {
 this.responseHandler=responseHandler;
 }
 public void doGet(String url,String user,String password,final Map<String,String> headers)
 {
  doRequest(null,url,user,password,headers,null,GET_TYPE);
 }
 public void doPost(String contentType,String url,String user,String password,
   Map<String,String>headers,Map<String ,String>params)
 {
  
  doRequest(contentType,url,user,password,headers,headers,POST_TYPE);
 }
 public void doPost(String url,String user,String password,
   Map<String,String>headers,Map<String ,String>params)
 {
  doRequest(null,url,user,password,headers,headers,POST_TYPE);
 }
 private void doRequest(String contentType,String url,String user,String password,
   Map<String,String>headers,Map<String ,String>params,int requestType)
 {
  DefaultHttpClient client=getClient();
  if((user!=null)&&password!=null)
  {
   UsernamePasswordCredentials credential=new UsernamePasswordCredentials(user,password);
   client.getCredentialsProvider().setCredentials(AuthScope.ANY, 
     credential);
  }
  final Map<String,String>sendHeaders=new HashMap<String,String>();
  if((headers!=null)&&(headers.size()>0))
  {
   sendHeaders.putAll(headers);
  }
  if(requestType==POST_TYPE)
  {
   sendHeaders.put(CONTENT_TYPE, contentType);
  }
  if(sendHeaders.size()>0)
  {
   HttpRequestInterceptor itcp=new HttpRequestInterceptor()
   {
   public void process(HttpRequest request, HttpContext context)
   throws HttpException,IOException
   {
    for(String key:sendHeaders.keySet())
    {
     if(!request.containsHeader(key))
     {
      request.addHeader(key,sendHeaders.get(key));
     }
    }
   } 
   };
   client.addRequestInterceptor(itcp);
  }
  if(requestType==POST_TYPE)
  {
   HttpPost method=new HttpPost(url);
   List<NameValuePair> nvps=null;
   if((params!=null)&&(params.size()>0))
   {
    nvps=new ArrayList<NameValuePair>();
    for(String key:params.keySet())
    {
     nvps.add(new BasicNameValuePair(key,params.get(key)));
    }
   }
   if(nvps!=null)
   {
    try
    {
     method.setEntity(new UrlEncodedFormEntity(nvps,HTTP.UTF_8));
    }catch(UnsupportedEncodingException e)
    {
     
    }
   }
   execute(client,method);
   }
  else if(requestType==GET_TYPE)
  {
   String paramStr="";
   for(String key:params.keySet())
   {
    paramStr=paramStr+"&"+key+"="+params.get(key);
   }
   paramStr=paramStr.replaceFirst("&", "?");
   url+=paramStr;
   HttpGet method=new HttpGet(url);
   execute(client,method);
  }
}
private void execute(HttpClient client,HttpRequestBase method)
{
 BasicHttpResponse errorResponse =new BasicHttpResponse(
   new ProtocolVersion("HTTP_ERROR",1,1),500,"Erro");
 try{
  client.execute(method,responseHandler);
 }
 catch(Exception e)
 {
  errorResponse.setReasonPhrase(e.getMessage());
  try{
  responseHandler.handleResponse(errorResponse);
  }catch(IOException ioe)
  {
   Log.e(tag, "erro:",ioe);
  }
 }
}
 private DefaultHttpClient getClient()
 {
  BasicHttpParams params= new BasicHttpParams();
  HttpConnectionParams.setConnectionTimeout(params, 20*1000);
  HttpConnectionParams.setSoTimeout(params, 20*1000);
  HttpConnectionParams.setSocketBufferSize(params, 10*1024);
  DefaultHttpClient client=new DefaultHttpClient(params);
  return client;
 }
}
///////////////////////////////////////////////////////////////////
 final static int SUCCESS = 0;
 final static int FAIL = 1;
 Handler handler = new Handler() {
  public void handleMessage(Message message) {
   Log.i(tag, "handle");
   if (message == null)
    return;
   int what = message.what;
   if (what == SUCCESS) {
    String text = message.getData().getString("content");
    textConent.setText(text);
    textConent.invalidate();