AI智能
改变未来

Android GET和POST完成网络请求

文章目录

  • GET和POST的区别
  • GET和POST的安全性
  • GET方法的长度限制
  • HTTP请求限制
    • 创建安全配置文件
    • 添加安全配置文件
  • 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数据

    赞(0) 打赏
    未经允许不得转载:爱站程序员基地 » Android GET和POST完成网络请求