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

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

话不多说,代码拉上来!


呃 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!

展开阅读全文

没有更多推荐了,返回首页