• Android网络请求


    HTTP请求与响应

    HTTP请求包结构

    例:

    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-urlencoded
    
        tel=13637829200&password=123456

    HTTP响应包结构

    例:

    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":"u6b64u7528u6237u4e0du5b58u5728uff01","data":null}

    Http请求方式

    常用的是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 = 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

  • 相关阅读:
    Linux rm rf 命令
    Oracle时间戳转换日期
    PHP执行代码的步骤
    PHP字符串比较
    PHP调整图片大小
    PHP学习笔记2022年9月13日
    索引数组
    腾讯云安全组开放端口不生效的解决办法
    php中使用fsockopen实现异步请求
    创建ftp账户并赋予指定权限
  • 原文地址:https://www.cnblogs.com/yl-saber/p/7413942.html
Copyright © 2020-2023  润新知