Android网络请求

上下观古今,起伏千万途。这篇文章主要讲述Android网络请求相关的知识,希望能为你提供帮助。
HTTP请求与响应
HTTP请求包结构

Android网络请求

文章图片

例:
POST /meme.php/home/user/login HTTP/1.1 Host: 114.215.86.90 Cache-Control: no-cache Postman-Token: bd243d6b-da03-902f-0a2c-8e9377f6f6ed Content-Type: application/x-www-form-urlencodedtel=13637829200& password=123456

HTTP响应包结构
Android网络请求

文章图片

例:
HTTP/1.1 200 OK Date: Sat, 02 Jan 2016 13:20:55 GMT Server: Apache/2.4.6 (CentOS) PHP/5.6.14 X-Powered-By: PHP/5.6.14 Content-Length: 78 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: application/json; charset=utf-8{"status":202,"info":"\\u6b64\\u7528\\u6237\\u4e0d\\u5b58\\u5728\\uff01","data":null}

Http请求方式
Android网络请求

文章图片

常用的是Post和Get
Get方式
在url中填写参数:http://xxxx.xx.com/xx.php?params1=value1& params2=value2
Post方式
参数是经过编码放在请求体中的。编码包括x-www-form-urlencoded  与  form-data
  x-www-form-urlencoded的编码方式是这样:  tel=13637829200& password=123456
  form-data的编码方式是这样:
----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="tel"13637829200 ----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="password"123456 ----WebKitFormBoundary7MA4YWxkTrZu0gW

x-www-form-urlencoded只能传键值对,form-data可以传二进制
HttpClient & HttpURLConnection
HttpClient已被废弃
HttpURLConnection的用法
public class NetUtils { public static String post(String url, String content) { HttpURLConnection conn = null; try { // 创建一个URL对象 URL mURL = new URL(url); // 调用URL的openConnection()方法,获取HttpURLConnection对象 conn = (HttpURLConnection) mURL.openConnection(); conn.setRequestMethod("POST"); // 设置请求方法为post conn.setReadTimeout(5000); // 设置读取超时为5秒 conn.setConnectTimeout(10000); // 设置连接网络超时为10秒 conn.setDoOutput(true); // 设置此方法,允许向服务器输出内容// post请求的参数 String data = https://www.songbingjia.com/android/content; // 获得一个输出流,向服务器写数据,默认情况下,系统不允许向服务器输出内容 OutputStream out = conn.getOutputStream(); // 获得一个输出流,向服务器写数据 out.write(data.getBytes()); out.flush(); out.close(); int responseCode = conn.getResponseCode(); // 调用此方法就不必再使用conn.connect()方法 if (responseCode == 200) {InputStream is = conn.getInputStream(); String response = getStringFromInputStream(is); return response; } else { throw new NetworkErrorException("response status is "+responseCode); }} catch (Exception e) { e.printStackTrace(); } finally { if (conn != null) { conn.disconnect(); // 关闭连接 } }return null; }public static String get(String url) { HttpURLConnection conn = null; try { // 利用string url构建URL对象 URL mURL = new URL(url); conn = (HttpURLConnection) mURL.openConnection(); conn.setRequestMethod("GET"); conn.setReadTimeout(5000); conn.setConnectTimeout(10000); int responseCode = conn.getResponseCode(); if (responseCode == 200) {InputStream is = conn.getInputStream(); String response = getStringFromInputStream(is); return response; } else { throw new NetworkErrorException("response status is "+responseCode); }} catch (Exception e) { e.printStackTrace(); } finally {if (conn != null) { conn.disconnect(); } }return null; }private static String getStringFromInputStream(InputStream is) throws IOException { ByteArrayOutputStream os = new ByteArrayOutputStream(); // 模板代码 必须熟练 byte[] buffer = new byte[1024]; int len = -1; while ((len = is.read(buffer)) != -1) { os.write(buffer, 0, len); } is.close(); String state = os.toString(); // 把流中的数据转换成字符串,采用的编码是utf-8(模拟器默认编码) os.close(); return state; } }

添加网络权限:< uses-permission android:name="android.permission.INTERNET"/>
 
同步& 异步
异步方式:
//在主线程new的Handler,就会在主线程进行后续处理。 private Handler handler = new Handler(); private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.text); new Thread(new Runnable() { @Override public void run() { //从网络获取数据 final String response = NetUtils.get("http://www.baidu.com"); //向Handler发送处理操作 handler.post(new Runnable() { @Override public void run() { //在UI线程更新UI textView.setText(response); } }); } }).start(); }

 
参考文献:http://www.jianshu.com/p/3141d4e46240
【Android网络请求】 

    推荐阅读