HttpURLConnection详解、JSON的使用

2023-05-16

1.Http网络请求方法

Http的请求方法代表了客户端想对服务器进行的操作,比如: POSTGET、HEAD、PUT、DELETE、TRACE、OPTIONS 。

常用的不过于CRUD四个。 增:PUT;删:DELETE;改: POST;查: GET。

1.1GET 与 POST

GET

向服务器请求数据,获取资源,在大部分网络请求中, GET方法非常常见,并且它具有幂等性。

GET请求没有请求体,对于GET请求的请求参数在URL后面加上一个"?"的后面,参数以 key=val ue

的形式。参数与参数之间使用"&"进行连接。

GET请求是通过 URL 传输参数的,所以GET请求可以传输的参数是有限的。

POST

用于向表单提交数据,传送的数据放在请求体中。

在POST请求中,请求参数放在请求体中,服务器会根据POST请求体中的参数创建一个页面,然后 返回给客户端。POST不具有幂等性。

 POST 与 GET 区别

1. 作用不同:GET 用于获取资源,而 POST 用于传输实体主体。

2. 参数位置不一样:GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出 现在 URL 中,而 POST 的参数存储在实体主体中。但是并不是 POST 参数存储在实体主体中就认 为它的安全性更高,我们可以通过一些抓包工具如(Fiddler)查看。 在URL 只支持 ASCII 码,因此 GET 的参数中如果存在中文等字符就需要先进行编码。例如 中文 会 转换为 %E4%B8%AD%E6%96%87 ,而空格会转换为 %20 。POST 支持标准字符集。

3. 安全性:安全的 HTTP 方法不会改变服务器状态,也就是说它只是可读的。 GET 方法是安全的, 而 POST 却不是,因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据, 上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。

2 Http——HttpURLConnection详解

2.1Android设置网络权限

在AndroidManifest.xml中添加

<uses-permission android:name="android.permission.INTERNET" />

2.2HttpURLConnection简介


在JDK的 java.net 包中已经提供了访问HTTP协议的基本功能的类:HttpURLConnection。 HttpURLConnection是Java的标准类,它继承自URLConnection,可用于向指定网站发送GET请求、 POST请求。

它在URLConnection的基础上提供了如下便捷的方法

int getResponseCode(); // 获取服务器的响应代码。

String getResponseMessage(); // 获取服务器的响应消息。

String getResponseMethod(); // 获取发送请求的方法。

void setRequestMethod(String method); // 设置发送请求的方法。

 2.3HttpURLConnection使用

使用GET方式访问HTTP

public class MainActivity extends AppCompatActivity {
    private TextView tv_text;
    private Button btn_get;
    String result = "";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_text = findViewById(R.id.tv_text);
        test();
        btn_get = findViewById(R.id.btn_get);
        btn_get.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //获取要访问的URL
                        try {
                            URL url = new URL("https://api.vvhan.com/api/love?type=json");
                            //获取访问对象
                            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                            //设置请求参数
                            connection.setDoOutput(false);
                            connection.setDoInput(true);
                            //设置请求方式
                            connection.setRequestMethod("GET");
                            //设置缓存
                            connection.setUseCaches(true);
                            //设置重定向
                            connection.setInstanceFollowRedirects(true);
                            //设置超时时间
                            connection.setConnectTimeout(4000);
                            //连接
                            connection.connect();
                            //获取响应码
                            int code = connection.getResponseCode();
                            if (code == 200) {
                                BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                                result = br.readLine();
                            }
                            handler.sendEmptyMessage(0x111);
                        } catch (MalformedURLException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
        });
 
    }
 
    private void test() {
        String result = "[{\"success\":true,\"id\":400,\"ishan\":\"你的侧脸应该制定为国家一级宝物。\"} \n," +
                "{\"success\":true,\"id\":300,\"ishan\":\"你的侧脸应该制定为国家一级宝物。\"} \n," +
                "{\"success\":true,\"id\":200,\"ishan\":\"你的侧脸应该制定为国家一级宝物。\"} \n]";
 
        try {
           JSONArray array = new JSONArray(result);
            for (int i = 0; i < array.length(); i++) {
                try {
                    JSONObject jsonObject = array.getJSONObject(i);
                    boolean success = jsonObject.getBoolean("success");
                    int id = jsonObject.getInt("id");
                    String s = jsonObject.getString("ishan");
                    Log.i("array","success:"+success+",id:"+id+",ishan:"+s);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
 
    }
 
    Handler handler = new Handler(Looper.getMainLooper()){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            if (msg.what==0x111) {
                JSONObject object = null;
                try {
                    object = new JSONObject(result);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                try {
                    boolean success = object.getBoolean("success");
                    int id = object.getInt("id");
                    String s = object.getString("ishan");
                    tv_text.setText(s);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
 
 
            }
        }
    };
 
 
}

使用POST方式访问HTTP

 try {
            URL url = new URL(“”);
            //得到网络访问对象
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(ture);
            connection.setDoInput(true);
            //设置请求方式
            connection.setRequestMethod("POST");
            //是否使用缓存
            connection.setUseCaches(true);
            // 设置此 HttpURLConnecti on 实例是否应该自动执行 HTTP 重定向
            connection.setInstanceFollowRedirects(true);
            // 设置三秒
            connection.setConnectTimeout(3000);
            //连接
 
 
    OutputStream out=connection.getOutputStream();
            out.write(param.getBytes());
            out.flush();
 
            connection.connect();
            int code = connection.getResponseCode();
            //如果返回码是200表示连接成功
            if (code == 200) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String line;
                if ((line = reader.readLine()) != null) {
                    result += line;
                }
                reader.close();
            }
            //断开连接释放资源
            connection.disconnect();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;

3 HttpURLConnection说明

HttpURLConnection对象不能直接构造,需要通过URL类中的openConnection()方法来获得。 对HttpURLConnection对象的配置都需要在connect()方法执行之前完成,因为connect()会根据

HttpURLConnection对象的配置值生成HTTP头部信息。

HttpURLConnection的connect()函数,实际上只是建立了一个与服务器的TCP连接,并没有实际 发送HTTP请求。 **HTTP请求实际上直到我们获取服务器响应数据(如调用getInputStream()、

getResponseCode()等方法)时才正式发送出去**。

HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现。如果不设置超时 (timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行。

HTTP正文的内容是通过OutputStream流写入的, 向流中写入的数据不会立即发送到网络,而是 存在于内存缓冲区中,待流关闭时,根据写入的内容生成HTTP正文。 调用getInputStream()方法时,返回一个输入流,用于从中读取服务器对于HTTP请求的返回信息

我们可以使用HttpURLConnection.connect()方法手动的发送一个HTTP请求,但是如果要获取

HTTP响应的时候,请求就会自动的发起,比如我们使用HttpURLConnection.getInputStream()方 法的时候,所以完全没有必要调用connect()方法。

4.JSON

Json(Javascript Object notation)作为一种轻量级的数据传输格式,在现代软件开发中广泛使用,采用完 全独立于语言的文本格式,具有可读性强、编写容易,更利于机器的解析与生成。

4.1JSON的结构

JSON具有以下这些表现形式

对象(JSONObject):

对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

JSONObject结构图

数组(JSONArray):

数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分 隔。
JSON的使用

                    SONObject object=new JSONObject(result);
                    JSONArray array=object.getJSONArray("data");
                    for (int i = 0; i < array.length(); i++) {
                        JSONObject object1=array.getJSONObject(i);
                        String title=object1.getString("title");
                        String desc=object1.getString("desc");
                        String pic=object1.getString("pic");
 
                       }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HttpURLConnection详解、JSON的使用 的相关文章

随机推荐

  • 使用PyTorch+functorch计算并可视化NTK矩阵

    2022年3月 xff0c PyTorch发布了PyTorch1 11和functorch functorch灵感来自于Google JAX xff0c 旨在提供vmap和autodiff转换配合PyTorch使用 本文将演示如何使用PyT
  • libcurl异步请求+http长连接池

    由于公司项目 xff0c 需要localhost的形式高并发的http访问本机服务 xff0c 所以面临了两方面的问题 xff1a 1 http短连接会造成大量的time wait xff0c 影响服务器的性能 2 libcurl easy
  • VC实现http发送get和post请求

    VC实现http发送get和post请求 get请求 首先通过前面介绍的抓包工具获取请求的详细内容 xff0c 然后再通过VC拼接Header xff0c 函数如下 xff1a bool CXXX http get eng mode lt
  • 链表(图文详解)

    链表的概念 链表是一种物理存储结构上非连续 xff0c 非顺序的存储结构 xff0c 数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表的结构是多式多样的 xff0c 当时通常用的也就是两种 xff1a 无头单向非循环列表 xff1a
  • PCB上能上锡的那层叫什么?

  • C++常用数学函数

    C 43 43 中有个头文件math h xff0c 它是数学函数库 一些数学计算的公式的具体实现是放在math h里 xff0c 为了方便大家使用 xff0c 特在此总结常用的一些函数 1 三角函数 double sin double d
  • LimeSDR实验教程(6) 发射GPS

    下载程序 xff1a git clone https github com osqzss gps sdr sim git 编译安装 xff1a cd gps sdr sim gcc gpssim c lm O3 o gps sdr sim
  • 如何理解引用作为函数的返回值?

    如何理解引用作为函数的返回值 xff1f 1 引用作为函数的返回值时 xff0c 必须在定义函数时在函数名前将 amp 2 用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本 span class token comment 代码
  • 自制合成孔径雷达(2) SDR实现的对比(SDR实现测速雷达)

    我今天查了查资料 xff1a 技术干货 xff1a 用LimeSDR Mini制作一台软件定义多普勒雷达 搜狐汽车 搜狐网 查阅一些文献后 xff0c 笔者想探寻减少雷达系统所需的昂贵模拟前端部件数量的可能性 设计灵感来自于Gregory
  • 自制合成孔径雷达(3) doppler代码解读

    上一篇帖子 xff0c 看完了基于SDR的多普勒雷达 xff0c 就可以看看硬件雷达的多普勒测速的DSP代码了 先看一下这个图 xff1a 我们需要的多普勒频移的测量结果是从混频器 xff08 Multiply Conjugate xff0
  • 各类SDR的USB接口一致性测试

    最近用高带宽示波器测了好几个SDR产品的USB2接口一致性 由于探头数量只有1个 xff0c 所以不能测全所有的项目 但已经包含了最主要的USB眼图 xff08 信号质量 xff09 项目 测试场景 xff1a 待测件包含 xff1a 1
  • Portapack应用开发教程(十八)NavTex接收 D

    上回说到 xff0c 我现在已经做到用自己的gnuradio流图从音频信号做fsk解调 xff0c 得到方波 然后用c程序把方波转为二进制数 又用python把二进制数转为最终的字母 但是遗留问题是python解码 xff0c 起始位如果错
  • Portapack应用开发教程(十八)NavTex接收 E

    我现在已经成功把两部分解码的代码合并到一起 实现的功能是从stdout取出方波的采样点幅度 xff0c 然后把它转为解码输出 include lt stdio h gt include lt string gt include lt mat
  • 使用RTL-SDR和Matlab Simulink玩转软件无线电(二十一)

    3 13 扫描频谱 xff1a 把 25MHz 到 1 75GHz 的信号都收下来 这一节我们会做本章最后一个练习 xff0c 使用一个 RTL SDR 扫描整个频率范围内的信号 对于大多数 RTL SDR 设备来说 xff08 R820T
  • SDR# (SDRSharp)代码讲解 (一)

    SDR 也称SDRSharp 与Linux平台下常用的GQRX类似 xff0c 是目前Windows平台上最常用的频谱观察 xff0c 音频解调软件 xff0c 支持AM FM SSB等多种调制方式 以SDRSharp为基础又派生出了其它一
  • 自动跟随机器人教程(一)(树莓派、Arduino教程)

    机器人购买链接 xff1a https item taobao com item htm spm 61 a1z38n 10677092 0 0 59a21debCqLXYP amp id 61 532012951368 接下来打算发布一款自
  • 自动跟随机器人教程(二)硬件组装

    本机器人结构应该说比较简单 xff0c 除了上述图片里的4样东西外 xff0c 就是一个USB摄像头和一块航模专用12V锂电池 xff08 与电机电压一致 xff09 xff0c 一共6样东西 所有这些东西都不需要螺丝固定 xff0c 多数
  • LimeSDR 中文教程 (一)

    行业应用及合作请联系 j shao 64 limemicro com xff08 本文所有图片请参考Myriadrf官网原文 xff1a https myriadrf org blog limesdr made simple part 1
  • Linux系统——fork()函数详解(看这一篇就够了!!!)

    fork 函数详解 包看包会 xff01 xff01 xff01 1 fork 简介 函数原型 xff1a pid t fork void xff1b pid t为int类型 xff0c 进行了重载pid t getpid 获取当前进程的
  • HttpURLConnection详解、JSON的使用

    1 Http网络请求方法 Http的请求方法代表了客户端想对服务器进行的操作 xff0c 比如 xff1a POST GET HEAD PUT DELETE TRACE OPTIONS 常用的不过于CRUD四个 增 xff1a PUT 删