Android GET和POST完成网络请求

GET和POST的区别

  • GET是从服务器上获得数据,而POST则是向服务器传递数据的
  • GET是不安全的,一些操作会被第三方看到,而POST的所有操作多用户来说是不可见的
  • GET传输的数据量小,主要是因为它受约于URL长度的限制,而POST可以传输大量的数据,所以在传文件的时候会用POST
  • GET限制From表单的数据集的值必须为ASCLL字符,而POST支持整个ISO10646字符集

GET和POST的安全性

关于POST比GET更安全,体现在其数据在地址栏是不可见的角度
但是从传输角度来说,因为HTTP在网络上都是明文传输,所以在传输上它们都很容易被抓包来获取数据报文
想要安全传输需使用HTTPS

GET方法的长度限制

HTTP协议本身没有对URL的长度限制,对URL的限制大多是浏览器和服务器的原因
服务器处理长URL要消耗较多的资源,为了性能和安全(恶意构造长URL进行攻击)考虑,会给URL长度加以限制

HTTP请求限制

创建安全配置文件

  1. 在res文件夹下创建xml/network_security_config文件
  2. 增加cleartextTrafficPermitted属性,设为true

在这里插入图片描述
在这里插入图片描述

添加安全配置文件

  1. AndroidManifest.xml中的Application申明

在这里插入图片描述

GET实现

请求的URL:http://www.imooc.com/api/teacher?type=3&cid=1
在这里插入图片描述

  1. 实例化一个URL对象
  2. 获取HttpURLConnection实例
  3. 设置和请求相关的属性
  4. 获取响应码
  5. 判断响应码并获取响应数据(响应正文)
    private void get() {
        try {
            // HttpURLConnection
            // 1.实例化一个URL对象
            URL url = new URL("http://www.imooc.com/api/teacher?type=3&cid=1");

            // 2.获取HttpURLConnection实例
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            // 3.设置和请求相关的属性
            /// 请求方式
            conn.setRequestMethod("GET");
            /// 请求超时时长
            conn.setConnectTimeout(6000);

            // 4.获取响应码  200:成功  404:未请求到指定资源    500:服务器异常
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                // 5.判断响应码并获取响应数据(响应正文)
                /// 获取响应的流
                InputStream in = conn.getInputStream();
                byte[] b = new byte[1024];
                int len = 0;
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                /// 在循环中读取输入流
                while ((len = in.read(b)) > -1) {// in.read()返回是int类型数据,代表实际读到的数据长度
                    // 将字节数组里面的内容写入缓存流
                    // 参数1:待写入的数组   参数2:起点  参数3:长度
                    baos.write(b, 0, len);
                }

                String msg = new String(baos.toByteArray());
                Log.e("TAG", msg + "======");
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

运行结果

2020-07-22 00:39:18.104 20976-21029/com.example.shopappdemo E/TAG: {"status":1,"data":{"title":"Tony\u8001\u5e08\u804ashell\u2014\u2014\u73af\u5883\u53d8\u91cf\u914d\u7f6e\u6587\u4ef6","author":"Tony","content":"\u672c\u8bfe\u7a0b\u662f\u300aTony\u8001\u5e08\u804ashell\u300b\u7cfb\u5217\u8bfe\u7a0b\u7684\u7b2c\u4e09\u7bc7\uff0c\u4e3a\u4f60\u5e26\u6765\u5e38\u7528\u7684\u73af\u5883\u53d8\u91cf\u914d\u7f6e\u6587\u4ef6\u7684\u4f7f\u7528\u3002"},"msg":"\u6210\u529f"}======

这里获取到的\uxxxx是Unicode编码,是并未解析的原始数据

POST实现

这里用登录功能来举例,实现提交并读取用户输入的账号user和密码pwd
请求的URL:http://www.imooc.com/api/okhttp/postmethod
POST的实现步骤和GET差别不大,只需要修改下面这几个地方

  1. 实例化URL对象,修改一下URL
	URL url = new URL("http://www.imooc.com/api/okhttp/postmethod");
  1. 修改第三步的请求方式,并在其下面设置相应属性
		// 3.设置和请求相关的属性
        ///请求方式
        conn.setRequestMethod("POST");
        /// 请求超时时长
        conn.setConnectTimeout(6000);
        /// 设置允许输出
        conn.setDoOutput(true);
        /// 设置请求数据的类型
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        /// 获取输出流(请求正文)
        OutputStream out = conn.getOutputStream();
        /// 写数据
        out.write(("user=" + user + "&pwd=" + pwd).getBytes());

运行结果
输入账号:admin,密码:12345

2020-07-22 15:22:58.556 24019-24377/com.example.shopappdemo E/TAG: {"errorCode":1,"data":{"ip":"183.27.156.22","headers":{"Accept-Encoding":"gzip","User-Agent":"Dalvik\/2.1.0 (Linux; U; Android 11; sdk_gphone_x86 Build\/RPB1.200504.020)","Content-Type":"application\/x-www-form-urlencoded","Content-Length":"20","X-Forwarded-For":"183.27.156.22","X-Real-Ip":"183.27.156.22","Host":"www.imooc.com","Connection":"upgrade"},"params":"user=admin&pwd=12345"},"errorMsg":""}======

这里的原始数据都是JSON数据
JSON是一种与开发语言无关的、轻量级的数据存储格式,一种数据格式的标准规范。像上面通过GET和POST方法读到的数据就是JSON的原始数据。
优点:易于用户阅读和编写,易于程序解析与生产
JSON样例:首先是一对花括号{},代表一整个JSON对象,同时里面是一种Key-Value的存储形式
在这里插入图片描述

注意

  • 权限问题,要提前完成网络权限配置
  • 网络操作需要开辟一个新的线程来执行
  • 可以利用JSONObject进行解析获取到的JSON数据
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,Android 中可以使用 HttpURLConnection 类来进行 HTTP 请求的发送,以下是一个简单的封装示例: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class HttpUtil { public static String sendHttpRequest(String urlStr, String method, String data) { HttpURLConnection connection = null; BufferedReader reader = null; try { URL url = new URL(urlStr); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod(method); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); connection.setDoInput(true); connection.setDoOutput(true); if (method.equals("POST")) { OutputStream outputStream = connection.getOutputStream(); outputStream.write(data.getBytes()); outputStream.flush(); outputStream.close(); } InputStream inputStream = connection.getInputStream(); reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } return response.toString(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } if (connection != null) { connection.disconnect(); } } return null; } } ``` 您可以使用 `sendHttpRequest` 方法来发送 HTTP 请求,需要传入请求的 URL、请求方法(GET 或 POST)以及请求数据(如果是 POST 请求)。方法会返回响应的数据。例如,发送一个 GET 请求: ```java String response = HttpUtil.sendHttpRequest("http://www.example.com/api", "GET", null); ``` 发送一个 POST 请求: ```java String data = "param1=value1&param2=value2"; String response = HttpUtil.sendHttpRequest("http://www.example.com/api", "POST", data); ``` 当然,上面的代码只是一个简单的封装示例,实际应用中需要进行更多的参数校验、错误处理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值