以下源代码,都是从开源中国app摘取。有借鉴之用。
/**
* 公用post方法
* @param url
* @param params
* @param files
* @throws AppException
*/
private static InputStream _post(AppContext appContext, String url, Map<String, Object> params, Map<String,File> files) throws AppException {
//System.out.println("post_url==> "+url);
String cookie = getCookie(appContext);
String userAgent = getUserAgent(appContext);
HttpClient httpClient = null;
PostMethod httpPost = null;
//post表单参数处理
int length = (params == null ? 0 : params.size()) + (files == null ? 0 : files.size());
Part[] parts = new Part[length];
int i = 0;
if(params != null)
for(String name : params.keySet()){
parts[i++] = new StringPart(name, String.valueOf(params.get(name)), UTF_8);
//System.out.println("post_key==> "+name+" value==>"+String.valueOf(params.get(name)));
}
if(files != null)
for(String file : files.keySet()){
try {
parts[i++] = new FilePart(file, files.get(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//System.out.println("post_key_file==> "+file);
}
String responseBody = "";
int time = 0;
do{
try
{
httpClient = getHttpClient();
httpPost = getHttpPost(url, cookie, userAgent);
httpPost.setRequestEntity(new MultipartRequestEntity(parts,httpPost.getParams()));
int statusCode = httpClient.executeMethod(httpPost);
if(statusCode != HttpStatus.SC_OK)
{
throw AppException.http(statusCode);
}
else if(statusCode == HttpStatus.SC_OK)
{
Cookie[] cookies = httpClient.getState().getCookies();
String tmpcookies = "";
for (Cookie ck : cookies) {
tmpcookies += ck.toString()+";";
}
//保存cookie
if(appContext != null && tmpcookies != ""){
appContext.setProperty("cookie", tmpcookies);
appCookie = tmpcookies;
}
}
responseBody = httpPost.getResponseBodyAsString();
//System.out.println("XMLDATA=====>"+responseBody);
break;
} catch (HttpException e) {
time++;
if(time < RETRY_TIME) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {}
continue;
}
// 发生致命的异常,可能是协议不对或者返回的内容有问题
e.printStackTrace();
throw AppException.http(e);
} catch (IOException e) {
time++;
if(time < RETRY_TIME) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {}
continue;
}
// 发生网络异常
e.printStackTrace();
throw AppException.network(e);
} finally {
// 释放连接
httpPost.releaseConnection();
httpClient = null;
}
}while(time < RETRY_TIME);
responseBody = responseBody.replaceAll("\\p{Cntrl}", "");
if(responseBody.contains("result") && responseBody.contains("errorCode") && appContext.containsProperty("user.uid")){
try {
Result res = Result.parse(new ByteArrayInputStream(responseBody.getBytes()));
if(res.getErrorCode() == 0){
appContext.Logout();
appContext.getUnLoginHandler().sendEmptyMessage(1);
}
} catch (Exception e) {
e.printStackTrace();
}
}
return new ByteArrayInputStream(responseBody.getBytes());
}从配置文件获取cookie
private static String getCookie(AppContext appContext) {
if(appCookie == null || appCookie == "") {
appCookie = appContext.getProperty("cookie");
}
return appCookie;
}
得到用户信息统计
private static String getUserAgent(AppContext appContext) {
if(appUserAgent == null || appUserAgent == "") {
StringBuilder ua = new StringBuilder("OSChina.NET");
ua.append('/'+appContext.getPackageInfo().versionName+'_'+appContext.getPackageInfo().versionCode);//App版本
ua.append("/Android");//手机系统平台
ua.append("/"+android.os.Build.VERSION.RELEASE);//手机系统版本
ua.append("/"+android.os.Build.MODEL); //手机型号
ua.append("/"+appContext.getAppId());//客户端唯一标识
appUserAgent = ua.toString();
}
return appUserAgent;
}
请求代理参数
private static HttpClient getHttpClient() {
HttpClient httpClient = new HttpClient();
// 设置 HttpClient 接收 Cookie,用与浏览器一样的策略
httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
// 设置 默认的超时重试处理策略
httpClient.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
// 设置 连接超时时间
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(TIMEOUT_CONNECTION);
// 设置 读数据超时时间
httpClient.getHttpConnectionManager().getParams().setSoTimeout(TIMEOUT_SOCKET);
// 设置 字符集
httpClient.getParams().setContentCharset(UTF_8);
return httpClient;
}
设置请求方法参数
private static PostMethod getHttpPost(String url, String cookie, String userAgent) {
PostMethod httpPost = new PostMethod(url);
// 设置 请求超时时间
httpPost.getParams().setSoTimeout(TIMEOUT_SOCKET);
httpPost.setRequestHeader("Host", URLs.HOST);
httpPost.setRequestHeader("Connection","Keep-Alive");
httpPost.setRequestHeader("Cookie", cookie);
httpPost.setRequestHeader("User-Agent", userAgent);
return httpPost;
}
errorcode==0
/**
* 未登录或修改密码后的处理
*/
public Handler getUnLoginHandler() {
return this.unLoginHandler;
}<span style="white-space:pre"> </span>private Handler unLoginHandler = new Handler(){
<span style="white-space:pre"> </span>public void handleMessage(Message msg) {
<span style="white-space:pre"> </span>if(msg.what == 1){
<span style="white-space:pre"> </span>UIHelper.ToastMessage(AppContext.this, getString(R.string.msg_login_error));
<span style="white-space:pre"> </span>UIHelper.showLoginDialog(AppContext.this);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>};
本文介绍了一个通用的POST方法实现,包括处理表单参数、文件上传、设置请求头等,并实现了重试机制和异常处理。此外还介绍了如何从应用上下文中获取cookie和用户代理信息。
1895

被折叠的 条评论
为什么被折叠?



