当前位置: 首页 > news >正文

Java网络编程——Request Response 对象

Response - 网页

上一章我们学习了 Java 中使用 Okhttp3 库请求网页或调用 API 的知识。

使用一条语句执行调用请求,并取得返回结果字符串:

call.execute().body().string()

execute() 方法是真正执行发送请求,前面的一系列代码是做前置准备。

这段代码获得服务器返回内容的专用代码,不具备通用性,所以基于很多 大神前辈 的编码风格,给大家展示简洁的连写风格。

其它情况下,不推荐使用连写风格。

要完全理解 body、状态码 这些知识点,可能还需要 学校 里学过 《计算机原理》《计算机网络》 课程,这里不用纠结。

可以 等学校里课程学完 后再来 复习 ,这里重点是学会 完成功能

即使不知道水稻是如何播种、如何收获的,但不妨碍大家吃饭

实际上,除了具体的返回结果,我们通常还关心的数据是:http 状态码。

状态码是用一个数字直观反映了本次请求的状况,例如常见的 200 表示请求成功了,404 表示出错了,服务端没有被请求的内容。

具体的状态码的较多,可以参考文档,这里就不赘述了。

为了取得响应状态码,可以使用语句:

call.execute().code()

这段代码获得服务器返回内容的专用代码,不具备通用性,所以基于很多 大神前辈 的编码风格,给大家展示简洁的连写风格。

但是通常还要读取响应内容,但是又不能执行两次请求,所以代码应该优化为:

import okhttp3.Response;// 执行请求
Response rep = call.execute();
// 获取响应状态码
int code = rep.code();
// 获取响应内容
String content = rep.body().string();

Response - 非文本文件

之前我们学习了 Java 中使用 Okhttp3 库获取状态码及返回的文本内容。

但实际上 Okhttp3 库不仅可以请求网页、API,也能请求图片、excel等各种文件。

例如豆瓣首页的图片:豆瓣网站

但我们知道,图片文件的明显不同之处在于,图片的内容不是可以直接阅读的字符文本,只是二进制编码,需要软件解析图片的二进制编码数据,才能还原成图像显示。

所以,请求图片、excel等各种非字符文本文件时,不能使用 response.body().string() 获取返回的内容,而是要使用:

response.body().bytes();

这段代码获得服务器返回内容的专用代码,不具备通用性,所以基于很多 大神前辈 的编码风格,给大家展示简洁的连写风格。

获取返回的二进制编码内容。

在 console 里我们看到输出:“图片 1705022 字节”,约 1.6 mb

在以后的章节中,我们会学习把请求的图片写入到图片文件中,这样可以通过浏览器等工具查看图片。本章就不赘述了。

关于二进制与字节,属于计算机的基础知识,不熟悉的同学可以看点击扩展阅读

Response - JSON

之前,我们学习了 Java 中使用 Okhttp3 库获取请求返回的内容。无论是文本文件,还是二进制文件,都能够熟练使用了。

而在工作中,经常会调用 API ,而很多 API 返回的文本内容是 JSON 格式的。

JSON 是一段文本,也就是 Java 的字符串,是难以进行解析具体内容的。必须转换成 Java 的对象。

之前我们已经学习过使用 fastjson 库把参数对象转换为 JSON 格式字符串,当然也可以把 JSON 结果转换为对象,方便程序今后一步分析。

JSON.parseObject()

附录

这节课我们用到了 JSON。对 JSON 及其使用不熟悉的同学,可以点击《JSON 与 FastJSON》文档

解析JSON对象

之前学习了如何查询 API ,获取 JSON 结构的结果。

实际工作中,对于返回值为 JSON 格式的 API ,我们不仅要学习如何调用 API ,更重要的是如何解析调用结果。

例如上节课的代码演示,通过查询 IP 地址信息的结果是:

{"status": "success","country": "China","countryCode": "CN","region": "ZJ","regionName": "Zhejiang","city": "Hangzhou","zip": "","lat": 30.294,"lon": 120.1619,"timezone": "Asia/Shanghai","isp": "Chinanet","org": "Chinanet ZJ","as": "AS4134 Chinanet","query": "115.227.217.8"
}

如果是更复杂的多次嵌套结构的 JSON 数据:

{"code": 0,"data": {"ip": "117.89.35.58","country": "中国","area": "","region": "江苏","city": "南京","county": "XX","isp": "电信","country_id": "CN","area_id": "","region_id": "320000","city_id": "320100","county_id": "xx","isp_id": "100017"}
}

只需要多次取出嵌套的 Map 对象即可:

Map contentObj = JSON.parseObject(content, Map.class);
Map dataObj = (Map)contentObj.get("data");
String city = (String)dataObj.get("city");

因为 Map 可以存储任何对象,所以从 Mapget() 到的对象必须指定其实际的类型:(Map)(String)

http://www.lryc.cn/news/419619.html

相关文章:

  • 【代码随想录训练营第42期 Day24打卡 回溯Part3 - LeetCode 93.复原IP地址 78.子集 90.子集II
  • python venv和virtualenv详解
  • 《征服数据结构》树堆(Treap)
  • 论文笔记:OneBit: Towards Extremely Low-bit Large Language Models
  • 英语文化中的音乐分类及其发展历史(Classical、Jazz、Rock、Pop、Electronic、Country、RB、Hip-Hop)
  • C语言-栈、队列、二叉树
  • pinia-plugin-persistedstate 插件不生效
  • sqlite 合并两个数据库中的特定表
  • winform中设置DateTimePicker参数为空
  • Python爬虫(8)
  • 靓图!多点创新!CEEMDAN-Kmeans-VMD-CNN-LSTM-Attention双重分解+卷积长短期+注意力多元时间序列预测
  • zdpgo_gin_limit 为zdpgo_gin打造的接口限流框架,当API接口需要限制访问频率的时候可以使用此框架
  • Java1234的Vue学习笔记
  • 嵌入式八股-C++面试91题(20240809)
  • 如何恢复误删视频?找回误删视频文件的办法分享
  • 游戏手柄开发一款游戏
  • 【阿旭机器学习实战】【39】脑肿瘤数据分析与预测案例:数据分析、预处理、模型训练预测、评估
  • 深度学习基础 - 梯度垂直于等高线的切线
  • py2exe打包
  • Gerrit存在两个未审核提交且这两个提交有冲突时的解决方案
  • 基于单片机的智能风扇设计
  • 【实战】Spring Security Oauth2自定义授权模式接入手机验证
  • Redis数据失效监听
  • 【达梦数据库】-SQL调优思路
  • DispatcherServlet 源码分析
  • 代码随想录算法训练营第十八天| 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
  • 会议室占用的时间(75%用例)D卷(JavaPythonC++Node.jsC语言)
  • C++初阶_1:namespace
  • 低代码开发平台:效率革命还是质量隐忧?
  • 在 Django 表单中传递自定义表单值到视图