还不清楚android网络请求的小伙伴们注意了。
本文来自http://blog.youkuaiyun.com/zuolongsnail/article/details/6373051加上本人自己的理解。
一:java.net包中的HttpURLConnection类,它是支持断点下载的
get请求
public static void requestByGet() throws Exception {
String path = "https://reg.163.com/logins.jsp?id=helloworld&pwd=android";
// 新建一个URL对象
URL url = new URL(path);
// 打开一个HttpURLConnection连接
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
// 设置连接超时时间
urlConn.setConnectTimeout(5 * 1000);
// 开始连接
urlConn.connect();
// 判断请求是否成功
if (urlConn.getResponseCode() == 200) {
// 获取返回的数据
Log.e(TAG_GET, "Get方式请求成功,返回数据如下:");
} else {
Log.e(TAG_GET, "Get方式请求失败");
}
// 关闭连接
urlConn.disconnect();
}
post请求 public static void requestByPost() throws Throwable {
String path = "https://reg.163.com/logins.jsp";
// 请求的参数转换为byte数组
String params = "id=" + URLEncoder.encode("helloworld", "UTF-8") + "&pwd=" + URLEncoder.encode("android", "UTF-8");
byte[] postData = params.getBytes();
// 新建一个URL对象
URL url = new URL(path);
// 打开一个HttpURLConnection连接
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
// 设置连接超时时间
urlConn.setConnectTimeout(5 * 1000);
// Post请求必须设置允许输出
urlConn.setDoOutput(true);
// Post请求不能使用缓存
urlConn.setUseCaches(false);
// 设置为Post请求
urlConn.setRequestMethod("POST");
urlConn.setInstanceFollowRedirects(true);
// 配置请求Content-Type
urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencode");
// 开始连接
urlConn.connect();
// 发送请求参数
DataOutputStream dos = new DataOutputStream(urlConn.getOutputStream());
dos.write(postData);
dos.flush();
dos.close();
// 判断请求是否成功
if (urlConn.getResponseCode() == 200) {
// 获取返回的数据
Log.i(TAG_POST, "Post请求方式成功,返回数据如下:");
} else {
Log.i(TAG_POST, "Post方式请求失败");
}
}
断点下载
public void dd(String mp3Url) throws MalformedURLException, IOException {
HttpURLConnection cn = (HttpURLConnection) new URL(mp3Url).openConnection();
cn.setConnectTimeout(5 * 1000);
// 0.GET :请求方式
cn.setRequestMethod("GET");
// 1. Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/*
// 表示该类型下的所有子类型,type/sub-type。
cn.setRequestProperty(
"Accept",
"image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
/**
* Accept-Language:浏览器申明自己接收的语言 语言跟字符集的区别:中文是语言,中文有多种字符集,
* 比如big5,gb2312,gbk等等。
*/
cn.setRequestProperty("Accept-Language", "zh-CN");
// Accept-Charset: 浏览器申明自己接收的字符集
cn.setRequestProperty("Charset", "UTF-8");
/**
* Range:浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的 哪部分。 例如:Range:
* bytes=100-300
*/
cn.setRequestProperty("Range", "bytes=" + 100 + "-" + 300);// 设置获取实体数据的范围 就是进行断点下载
/**
* 浏览器表明自己的身份(是哪种浏览器)。 例如:User-Agent:Mozilla/5.0 (Windows; U; Windows NT
* 5.1; zh-CN; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14
*/
cn.setRequestProperty(
"User-Agent",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");
/**
* Connection:请求:close(告诉WEB服务器或者代理服务器,在完成本次请求的响应 后,断开连接,不要等待本次连接的后续请求了)。
* keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的 响应后,保持连接,等待本次连接的后续请求)。
* 响应:close(连接已经关闭)。 keepalive(连接保持着,在等待本次连接的后续请求)
*/
cn.setRequestProperty("Connection", "Keep-Alive");
cn.connect();
// MP3的大小
InputStream stream = cn.getInputStream();
}
二:org.apache.http包中的HttpGet和HttpPost类
get请求
private static String JSESSIONID = "";
// HttpGet方式请求
public static void requestByHttpGet() throws Exception {
String path = "https://reg.163.com/logins.jsp?id=helloworld&pwd=android";
// 新建HttpGet对象
HttpGet httpGet = new HttpGet(path);
// 获取HttpClient对象
DefaultHttpClient httpClient = new DefaultHttpClient();
// 这里是设置session,不要求的填session的,这步可以去掉
if (JSESSIONID != "") {
CookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", JSESSIONID);
cookie.setDomain("填域名");
cookie.setPath("填路径");
cookieStore.addCookie(cookie);
httpClient.setCookieStore(cookieStore);
}
// 获取HttpResponse实例
HttpResponse httpResp = httpClient.execute(httpGet);
// 这里是获取session,<span style="font-family: Arial;">不要求填session,这步</span><span style="font-family: Arial;">可以去掉 </span>
if (JSESSIONID == "") {
CookieStore cookiestore = httpClient.getCookieStore();
List<Cookie> list = cookiestore.getCookies();
for (Cookie cookie : list) {
if ("JSESSIONID".equals(cookie.getName())) {
JSESSIONID = cookie.getValue();
}
}
}
// 判断是请求成功
if (httpResp.getStatusLine().getStatusCode() == 200) {
// 获取返回的数据
Log.i("TAG_HTTPGET", "HttpGet方式请求成功,返回数据如下:");
} else {
Log.i("TAG_HTTPGET", "HttpGet方式请求失败");
}
}
post请求 public static void requestByHttpPost() throws Exception {
String path = "https://reg.163.com/logins.jsp";
// 新建HttpPost对象
HttpPost httpPost = new HttpPost(path);
// Post参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", "helloworld"));
params.add(new BasicNameValuePair("pwd", "android"));
// 设置字符集
HttpEntity entity = new UrlEncodedFormEntity(params, HTTP.UTF_8);
// 设置参数实体
httpPost.setEntity(entity);
// 获取HttpClient对象
DefaultHttpClient httpClient = new DefaultHttpClient();
// 获取HttpResponse实例
HttpResponse httpResp = httpClient.execute(httpPost);
// 判断是够请求成功
if (httpResp.getStatusLine().getStatusCode() == 200) {
// 获取返回的数据
String result = EntityUtils.toString(httpResp.getEntity(), "UTF-8");
Log.i("TAG_HTTPGET", "HttpPost方式请求成功,返回数据如下:");
Log.i("TAG_HTTPGET", result);
} else {
Log.i("TAG_HTTPGET", "HttpPost方式请求失败");
}
}