Android中的网络请求可以分为两种,HttpUrlConnection还有HttpClient,虽然Android中的网络请求框架很多,或许看起来让人觉得眼花缭乱,比如,vollery,Afinal等等。

但是万变不离其宗,这些框架都是根据这两个网络请求多次封装而成的。下面就主要介绍一下HttpUrlConnection和HttpClient。

Http(Hypertext Transfer Protocol)超文本传输协议,是一个基于请求/响应模式的无状态的协议,Http1.1版给出了持续连接的机制,客户端建立连接之后,可以发送多次请求,当不会再发送时再关闭连接。

HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能:HttpURLConnection。但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。

除此之外,在Android中,androidSDK中集成了Apache的HttpClient模块,用来提供高效的、最新的、功能丰富的支持 HTTP 协议工具包,并且它支持 HTTP 协议最新的版本和建议。使用HttpClient可以快速开发出功能强大的Http程序。

Android使用java,对于Http协议的基本功能由两种实现方案:

1,使用JDK的java.net包下的HttpURLConnection

2.使用Apache的HttpClie

Android SDK中集成了Apache的HttpClient模块,也即说Android上两种方法都能用。

区别:

HttpClient是个很不错的开源框架,封装了访问http的请求头,参数,内容体,响应等等,
HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便,比如重访问的自定义,以及一些高级功能等。

HttpClient的功能比较全,更加强大,而HttpURLConnection的功能比较原始和简单,但是性能更好

在Android2.x的版本中使用HttpURLConnection有bug,但是后来高级版本的Android已经将bug修复,并且做了一些进一步的优化工作,所以建议在高版本的Android中(android2.3)以后使用HttpURLConnection,低版本的仍使用HttpClient

再简单说一下POST和GET这两种方式吧:

get是从服务器上获取数据,post是向服务器传送数据

get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制,但理论上IIS4中最大量为80KB,IIS5中为100KB

get安全性非常低,post安全性较高,但是执行效率却比Post方法好

所以建议:

get方式的安全性叫post方式要差些。包含机密信息的话,建议用post数据提交方式

在做数据查询时,建议用GET方式,在做数据添加,修改或删除时,建议用POST方式

HttpUrlConnection:

···package com.zxx.httptest.normalnet;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;

/**

  • 请求数据接口
  • @author zxx

*/
public class HttpUrlConnectionUtils {

private static final String DEF_CHATSET = "UTF-8";private static String userAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36";private static int DEF_CONN_TIMEOUT = 30000;public static String doGET(String strUrl, Map params) throws Exception {    HttpURLConnection conn = null;    BufferedReader reader = null;    String rs = null;    try {        StringBuffer sb = new StringBuffer();        strUrl = strUrl + "?" + urlencode(params);        URL url = new URL(strUrl);        conn = (HttpURLConnection) url.openConnection();        conn.setRequestMethod("GET");        conn.setRequestProperty("User-agent", userAgent);        conn.setUseCaches(false);        conn.setConnectTimeout(DEF_CONN_TIMEOUT);        conn.setInstanceFollowRedirects(false);        conn.connect();        InputStream is = conn.getInputStream();        reader = new BufferedReader(new InputStreamReader(is, DEF_CHATSET));        String strRead = null;        while ((strRead = reader.readLine()) != null) {            sb.append(strRead);        }        rs = sb.toString();    } catch (Exception e) {        // TODO: handle exception        e.printStackTrace();    } finally {        if (reader != null) {            reader.close();        }        if (conn != null) {            conn.disconnect();        }    }    return rs;}public static String doPOST(String strUrl, Map params) throws Exception {    HttpURLConnection conn = null;    BufferedReader reader = null;    String rs = null;    try {        StringBuffer sb = new StringBuffer();        URL url = new URL(strUrl);        conn = (HttpURLConnection) url.openConnection();        conn.setRequestMethod("POST");        conn.setDoInput(true);        conn.setRequestProperty("User-agent", userAgent);        conn.setUseCaches(false);        conn.setConnectTimeout(DEF_CONN_TIMEOUT);        conn.setInstanceFollowRedirects(false);        conn.connect();        DataOutputStream out = new DataOutputStream(conn.getOutputStream());        out.writeBytes(urlencode(params));        InputStream is = conn.getInputStream();        reader = new BufferedReader(new InputStreamReader(is, DEF_CHATSET));        String strRead = null;        while ((strRead = reader.readLine()) != null) {            sb.append(strRead);        }        rs = sb.toString();    } catch (Exception e) {        // TODO: handle exception    } finally {        if (reader != null) {            reader.close();        }        if (conn != null) {            conn.disconnect();        }    }    return rs;}// 将map型转为请求参数型private static String urlencode(Map params) {    // TODO Auto-generated method stub    StringBuilder sb = new StringBuilder();    for (Map.Entry i : params.entrySet()) {        try {            sb.append(i.getKey()).append("=")                    .append(URLEncoder.encode(i.getValue() + "", "UTF-8"))                    .append("&");        } catch (Exception e) {            // TODO: handle exception            e.printStackTrace();        }    }    return sb.toString();}

}
···
大致流程就是通过URL获取相应的HttpURLConnection然后通过urlencode这个方法将请求的url和所要筛选的参数进行拼接。然后放入到HttpURLConnection并开始向服务器请求,然后通过getInputStream方法获取请求的InputStream,最后通过封装到BufferedReader并转化相应的编码。对于得到的BufferedReader进行readLine,如果不为空的话,就说明读取到了数据,同时也表明请求成功。不要忘了在最后还是要释放该释放的资源。当然,这是get请求方式,如果是post的话大体上是差不多,不过有区别的是:
···
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
out.writeBytes(urlencode(params));
···
需要做一下上述的处理,我的理解是可能是post方式为了安全性考虑吧,对拿到的最终的url进行了类似加密,或者再一次封装的操作,这一部分没有细究。不过大体应该是这个意思。

HttpClient:

···
package com.zxx.httptest.normalnet;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
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.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

public class HttpClientUtils {

private static final String DEF_CHATSET = "UTF-8";
private static String userAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36";
private static int DEF_CONN_TIMEOUT = 30000;

public static String doGET(String urlAddress, Map params) {
String getUrl = urlAddress + "?" + urlencode(params);
HttpGet mHttpGet = new HttpGet(getUrl);
HttpParams mHttpParams = mHttpGet.getParams();
HttpConnectionParams.setStaleCheckingEnabled(mHttpParams, false);
HttpConnectionParams.setConnectionTimeout(mHttpParams, 10 * 1000);// 设置请求超时10秒
HttpConnectionParams.setSoTimeout(mHttpParams, 10 * 1000); // 设置等待数据超时10秒
HttpConnectionParams.setSocketBufferSize(mHttpParams, 32 * 1024);
mHttpParams.getParameter("true");

HttpClient mHttpClient = new DefaultHttpClient(mHttpParams);
try {
HttpResponse mHttpResponse = mHttpClient.execute(mHttpGet);
if (mHttpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity mHttpEntity = mHttpResponse.getEntity();
InputStream is = mHttpEntity.getContent();
BufferedReader br = new BufferedReader(
new InputStreamReader(is));
String response = "";
String readLine = null;
while ((readLine = br.readLine()) != null) {
response = response + readLine;
}
is.close();
br.close();

System.out.println("=====" + response);
return response;
} else {
return "error";
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return "exception";
}
}

public static String doPOST(String urlAddress, Map params) {
HttpPost mHttpPost = new HttpPost(urlAddress);
// List params = new ArrayList();
// NameValuePair pair1 = new BasicNameValuePair("username",
// username);
// NameValuePair pair2 = new BasicNameValuePair("password",
// password);
// params.add(pair1);
// params.add(pair2);
HttpParams mHttpParams = mHttpPost.getParams();
HttpConnectionParams.setStaleCheckingEnabled(mHttpParams, false);
HttpConnectionParams.setConnectionTimeout(mHttpParams, 10 * 1000);// 设置请求超时10秒
HttpConnectionParams.setSoTimeout(mHttpParams, 10 * 1000); // 设置等待数据超时10秒
HttpConnectionParams.setSocketBufferSize(mHttpParams, 32 * 1024);

List temparams = new ArrayList();
temparams = getParams(params);
HttpEntity mHttpEntity;
try {
mHttpEntity = new UrlEncodedFormEntity(temparams, DEF_CHATSET);
mHttpPost.setEntity(mHttpEntity);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
HttpClient mHttpClient = new DefaultHttpClient(mHttpParams);
try {
HttpResponse mHttpResponse = mHttpClient.execute(mHttpPost);
// 连接成功
if (mHttpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity httpEntity = mHttpResponse.getEntity();
InputStream is = httpEntity.getContent();
BufferedReader br = new BufferedReader(
new InputStreamReader(is));
String response = "";
String readLine = null;
while ((readLine = br.readLine()) != null) {
response = response + readLine;
}
is.close();
br.close();

System.out.println("=====&&" + response);
return response;
} else {
return "error";
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return "exception";
}
}

// 将map型转为请求参数型
private static String urlencode(Map params) {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
for (Map.Entry i : params.entrySet()) {
try {
sb.append(i.getKey())
···
···
.append("=")
.append(URLEncoder.encode(i.getValue() + "",
DEF_CHATSET)).append("&");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
return sb.toString();
}

private static List getParams(Map params) {

List result = new ArrayList();
for (Map.Entry i : params.entrySet()) {
result.add(new BasicNameValuePair((String) i.getKey(), (String) i.getValue()));
}
return result;
}
}
···
大致流程关于GET:
会先申明HttpGet,并将相应的请求url装载进去,还可以得到其params进行相应的请求设置,并一起装载到HttpClient中去,通过execute方法开始对请求做处理,当然方法返回的是一个HttpResponse对象,拿到这个对象就好说了,因为HttpClient内部做了一系列的封装,所以处理起来也很方便,我们可以通过拿到相应HttpResponse的getStatusCode的请求码,并对此作判断。返回200也就表示请求成功。然后就可以过去HttpResponse.getEntity的请求结果实体了,
···
mHttpEntity.getContent();
···
处理请求。接下来的操作都是一样的。见代码。

上面的代码是可以直接当作工具类来使用的。如果有什么说的不对的还望指出哈,共同交流进步。

更多相关文章

  1. Android的string-array数据源简单使用
  2. Android数据库工具ORM-greenDAO学习
  3. Android中SQLite数据库存储方式 .(转)
  4. 创建android逐帧动画的两种方式 布局和java代码
  5. android中使用Intent在activity之间传递数据
  6. android批量插入数据效率对比
  7. 4.11笔记 android database打开方式,ios反射
  8. android 常用的数据库表以及操作说明

随机推荐

  1. Android(安卓)MatrixCursor的详解
  2. adb shell 查看系统属性(用来判断特殊的操
  3. ListView中几个需要注意的属性
  4. Android高通平台下编译时能生成(拷贝)预
  5. Android(安卓)个推 Clientid,PushManagerR
  6. Android_SQLite数据库详解
  7. Android(安卓)创建证书 或加固后更新签名
  8. android toast使用总结
  9. Android(安卓)AsyncTask几个注意事项
  10. Android(安卓)Studio 2.2 NDK开发 opencv