手动get post请求网络(面向http协议向服务器提交数据)

来源:互联网 发布:自学数据库视频教程 编辑:程序博客网 时间:2024/05/21 04:23

手动写这两种请求网络方式,都是些基础,但是么得基础,如何更好的理解第三方库呢,说白了第三方库不也是对基础的封装嘛。

话不多说,代码拉上来!


呃 wait... 先来说下两种方式的原理和不同,采用HttpUrlConnection 

Get请求

 原理:把要提交的数据组拼到url后面
* 数据长度不超过4kb,IE超过1Kb会摒弃掉后面的数据

 优点:代码书写简单
 缺点:不安全

这个方法是流转换成字符串的工具类
private void requestNetWorkGet() {    try {        //把要提交的数据放在url里,accounts pwd为用户输入        String path = "http://192.168.1.100:8080/web/LoginServer" + "?accounts = " + accounts + "&pwd = " + pwd;                //创建一个Url        URL url = new URL(path);                //用url打开连接        HttpURLConnection conn = (HttpURLConnection) url.openConnection();                //设置请求参数        conn.setRequestMethod("GET");        conn.setReadTimeout(3000);        conn.setConnectTimeout(3000);                //获取状态码        int code = conn.getResponseCode();                //* 2xxx成功 3xxx重定向 4xxx资源错误 5xxx服务器错误        if (code == 200) {            //获取服务器返回的输入流            InputStream is = conn.getInputStream();                        //将溜流转换成字符串            String text = StreamUtils.parseStream(is);                        //拿到这个text可以在子线程中用Toast弹出来,用来测试请求成功与否 这里我就不继续做了        }    } catch (Exception e) {        // TODO Auto-generated catch block        e.printStackTrace();        }        return null;    }}public static String parseStream(InputStream is) {    try {        //内存输出流 效率高        ByteArrayOutputStream baos = new ByteArrayOutputStream();                byte[] buffer = new byte[1024 * 8];        int len = -1;                //读取流        while ((len = is.read(buffer)) != -1) {            baos.write(buffer, 0, len);        }                //拿到二进制的数据        byte[] byteArray = baos.toByteArray();                //默认的编码还是utf-8        return new String(byteArray);    } catch (Exception e) {        e.printStackTrace();        return null;    }}


Post请求

 原理:把数据放到经过Url编码的表单中去提交
 优点:安全
 缺点:代码书写相比get繁琐

private void requestNetWorkPost() {    try {        //把要提交的数据放在url里,注意:这里与GET方式不一样        String path = "http://192.168.1.100:8080/web/LoginServer";                //创建一个Url        URL url = new URL(path);                //用url打开连接        HttpURLConnection conn = (HttpURLConnection) url.openConnection();                //设置请求参数        conn.setRequestMethod("Post");        conn.setConnectTimeout(3000);                //添加两个请求头        String t = "accounts = " + accounts + "&pwd = " + pwd;        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");        conn.setRequestProperty("Content-length", String.valueof(t.length()));                //生命声明要给服务器写数据        conn.setDoOutput(true);        conn.getOutputStream().write(t.getBytes());                //获取状态码        int code = conn.getResponseCode();                //* 2xxx成功 3xxx重定向 4xxx资源错误 5xxx服务器错误        if (code == 200) {            //获取服务器返回的输入流            InputStream is = conn.getInputStream();                        //将溜流转换成字符串            String text = StreamUtils.parseStream(is);                        //拿到这个text可以在子线程中用Toast弹出来,用来测试请求成功与否 这里我就不继续做了        }    } catch (Exception e) {        // TODO Auto-generated catch block        e.printStackTrace();        }        return null;    }}


两种请求方式的不同:(1)url不一样
    (2)请求方式不一样
    (3)post需要添加两个请求头
    (4)post需要声明给服务器写数据

HttpClient在android6.0以后已经不再提供org.apache.http.*,因为HTTP请求比Socket多很多,我在这里也就不在详细编写。

当然,有很多网络框架Volley、Android-async-http(基于HttpClient库)、Afinal、xUtils、OKHttp、retrofit、
框架都是对基本的封装,各个框架的优缺点等等我先不在这篇博文说,希望大家在基础上,把框架的源码也能读懂。

滴水穿石 go for it!

阅读全文
0 0
原创粉丝点击