Java网络编程-简单的API调用

Get请求 - 无参数

安装依赖库

首先需要安装一个库: Okhttp3,这是一个非常流行的 HTTP 库,可以简单、快速的实现 HTTP 调用。

安装 Okhttp3 的方式是在 pom.xml 文件中增加依赖:

<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency>
 <groupId>com.squareup.okhttp3</groupId>
 <artifactId>okhttp</artifactId>
 <version>4.1.0</version>
</dependency>

唯一的 <dependencies> 标签中,包含多个 <dependency> 标签,每一个 <dependency> 标签表示一个依赖库。书写时注意嵌套顺序哦。

pom.xml 文件的作用就是定义 Java 项目需要用到(或者说依赖到)哪些库。

使用详解

例如要抓取“中国科学技术大学”首页的内容:

使用 Okhttp3 完成页面请求,需要三大步骤:

1.实例化 OkHttpClient

OkHttpClient okHttpClient = new OkHttpClient(); 

2.执行调用

在执行调用之前需要实例化一个 Request 对象,作用是定义请求的各种参数:

Request request = new Request.Builder().url(url).build();

然后构建调用对象 :

Call call = okHttpClient.newCall(request);

3.最后执行调用,调用失败可能异常,所以必须抓取异常

call.execute() 返回的是一个执行的结果对象,调用对象的方法即可获取返回的字符串内容:

result=call.execute().body().string();//添加try-catch

这个过程你可以类比打电话:

  • 拿出手机,相当于实例化Request对象,
  • 拨号,相当于newCall()方法,这些都是前置操作,
  • 每说一句话,相当于执行 execute() 方法,
  • 听到对方说的话,就相当于获取返回结果 body().string()

演示的代码基本上都属于固定写法

举例:

public class GetPage {
public String getContent(String url){
OkHttpClient okHttpClient = new OkHttpClient();
//定义一个请求,配置,urL,
Request request = new Request. Builder().url(url).build();
Call call = okHttpClient.newCall(request);
String result = null;

try {
result = call. execute().body() .string();
}
catch (IOException e) {
System.out.println("request" + url + "error.");
e. printStackTrace;
}
return result;
}
public static void main (String[] args) {
GetPage getPage = new GetPage();
String url = "https://www.ustc.edu.cn/";
String content = getPage.getContent (url);
System.out.println("call" + url + " ,conent=" + content);
}

把调用的步骤封装在一个 getContent() 方法中,比较容易理解,也方便复用。

注意:不要忘记 pom.xml 文件添加依赖,以及代码中使用 import 语句引入使用的类。

关于输出结果

call.execute().body().string(); 可以取得服务器返回的具体内容。

在 console 中看到的大量的文本内容,这是给浏览器识别的内容,包含了很多无效的内容。所以很多时候,我们使用程序调用 API,获取到需要的数据。

什么是 API

API 全称 Application Programming Interface,应用程序接口,API 一般是指一些预先定义的函数,目的是可以为开发人员快速访问某一程序,而无需了解和访问源码,或理解它内部工作机制的细节。

简单的讲,API 可以快速调用某个程序

这在计算机里叫做接口,我们生活中也有很多接口,比如 U 盘可以储存信息,我们访问 U 盘,只需要把 U 盘插到电脑上就可以访问,插入的 USB 接口就是一个接口,不需要关心它是如何实现的。又比如电视机上有很多接口,有的连话筒,有的连视频,我们只需要直接插上对应的线就可以实现相应的功能,并不关心它的具体机制。

调用 API

我们看一个查询 杭州市 天气的 API :https://api.seniverse.com/v3/weather/daily.json?key=SCYrvkytJze9qyzOh&location=杭州

把这个 URL 贴到浏览器,可以看到查询返回结果为:

{"results":[{"location":{"id":"WTMKQ069CCJ7","name":"杭州","country":"CN","path":"杭州,杭州,浙江,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"daily":[{"date":"2023-05-09","text_day":"晴","code_day":"0","text_night":"晴","code_night":"1","high":"20","low":"10","rainfall":"0.00","precip":"0.00","wind_direction":"东","wind_direction_degree":"90","wind_speed":"23.4","wind_scale":"4","humidity":"69"},{"date":"2023-05-10","text_day":"阴","code_day":"9","text_night":"小雨","code_night":"13","high":"22","low":"12","rainfall":"5.40","precip":"0.88","wind_direction":"东","wind_direction_degree":"90","wind_speed":"32.8","wind_scale":"5","humidity":"75"},{"date":"2023-05-11","text_day":"小雨","code_day":"13","text_night":"阴","code_night":"9","high":"20","low":"15","rainfall":"0.43","precip":"0.41","wind_direction":"无持续风向","wind_direction_degree":"","wind_speed":"3.0","wind_scale":"1","humidity":"80"}],"last_update":"2023-05-09T08:00:00+08:00"}]}

这一大段的内容,跟常见的精美的网页不同,全是数据,看到有些眼花缭乱。仔细看还是能看到 2023-05-09 杭州 的天气是 

数据基本上不是让人直接阅读的,是给前端程序使用

所谓 API,本质上就是一个 URL。开头也是 http(或https),与精美的网页相比,内容有明显的区别。API 返回的内容统称为数据

网络编程的学习方法

网络编程与程序最大的不同,是用到了新的程序开发包 。

这种程序开发包,由于不是 Java 官方出品的,而是其他公司或个人 开源 的,通常也叫 二方包 。程序开发包,是为了更加简便的完成某些特定的功能,提升开发效率。

如果不用 Okhttp3 ,而用 JDK 内置的类,也能完成相同的功能,但代码量会大很多。上一节 getContent() 方法大约有 18 行,如果不用 Okhttp3 代码量可能要再增加 3-4 倍。

不熟悉计算机网络知识就无法编程了吗?

答案是否定的: 当然可以编程 。

需要改变学习方法

学习开源技术的方法,与学习其它知识的方法,略有不同。

例如 Okhttp3 程序开发包的使用,可以从粗到细的学习,首先要知道这个技术解决了什么问题。

做什么

学过本课程,我们再看到一个新的 网址 ,必须能够想到使用 Okhttp3 获取其内容。

新网址无论是网页还是 API ,都要能举一反三,都能想到可以用 Okhttp3

怎么做

在第一节课中,已经把抓取过程的代码,封装在一个方法中:

public String getContent(String url) {
}

调用这个方法很简单,只要在参数中输入想抓取的网址,就会返回抓取的内容。

学习重点

记住:调用 getContent() 方法,即可抓取到网址的内容。首先要了解的是:知道什么代码可以解决什么问题、完成什么功能。

如果 getContent() 方法内的代码细节看不懂,也 不要纠结 。因为编程与考试不同,开发编程是允许查资料的。

我们可以把完整的 getContent() 方法代码记在电脑上,例如印象笔记等各种笔记软件,甚至手写在纸质笔记本上都可以。需要用的时候 copy 出来,即可完成功能。

当然,不要忘了两个配套步骤:添加依赖,不要遗漏 import 语句。

后面要特别注意区分,不同的代码适用于什么场景、能解决什么问题。

未来持续学习

待自己补充了计算机网络的理论知识,加上编程达到熟练程序以后,就可以回过头来研究 Okhttp3 的代码细节啦。

先预览一下 Okhttp3 的源代码:

Get请求 - 有参数

很多情况下,API 调用需要参数,例如下列查询 IP 地址信息的 API :

http://ip-api.com/json/?lang=zh-CN

只要把包含参数的完整的 URL 直接传入到方法中就可以了。

POST表单数据

先来看一个故事:

话说灵剑派新弟子招募大会升仙大会在灵剑山下的灵溪镇召开,王陆跃跃欲试,也来到灵溪镇。镇上只有一家如家客栈,如果住不进去,就只能露宿街头了。
王陆来到如家客栈门口,只见一群人围在客栈门口,王陆很好奇,这是怎么回事呢?
此时老板娘来到客栈门前,开口说道:欲入住咱们如家客栈,除了需要登记姓名、年龄、籍贯外,最重要的,是必须持有准入券,请持有准入券者入内登记吧。
王陆微微一笑,嗖的一声从怀里掏出一张长方形纸片,只见白底绿纹上三个大字:准入券,字上鲜红大印格外醒目。老板娘接过准入券笑吟吟做个手势:客官请。

提交数据至服务端进行增加、修改、删除等操作,都是 POST 操作。与王陆登记入住客栈类似,我们在网页上提交表单进行登录的场景,就是典型的 POST 操作。

post() 方法

Okhttp3 库也支持 POST 操作。前面学习的调用 API 属于 GET 操作。不同的是,POST 操作时,数据不是放在 URL 中的,而是放在表单中提交的。

所以程序实现需要构建一个 FormBody 表单对象,用于放置表单数据。核心代码如下:

Builder builder = new FormBody.Builder();
// 设置数据,第一个参数是数据名,第二个参数是数据值
builder.add("", "");
FormBody formBody = builder.build();
Request request = new Request.Builder().url(url).post(formBody).build();

数据的写法是不是很眼熟呢?整体步骤跟请求 API 相似,不同的是,在构建 Request 对象时,使用 .post(formBody) 语句放入表单对象,就表示执行 POST 操作啦。

连写代码

这段代码出现了连写:

new Request.Builder().url(url).post(formBody).build();

大多数情况下 不推荐 使用连写(特别是新手不要使用连写)的方式。不用连写的方式应该写作:

Request.Builder build = new Request.Builder();
build = build.url(url);
build = build.addHeader("Referer", "http://www.taobao.com");
build = build.post(formBody);
Request request = build.build();

Request.Builder 表示 Builder 是 Request 的内部类。特殊的是需要通过 Request 类引用 Builder 类。

要完全理解 url header post 这些知识点,还需要 《计算机原理》 、 《计算机网络》 课程,这里不用纠结。可以 等学校里课程学完 后再来 复习 ,这里重点是学会 完成功能 。

不连写的代码可能对新手更友好一点。但这段代码是发送 POST 请求专用的代码,不具备通用性,所以基于很多 大神前辈 的编码风格,给大家展示简洁的连写风格。

我们仍然把发送表单数据的过程,封装为 postContent() 方法,方便重用。这里的重点是,理解使用 FormBody 对象的实例来存放表单数据。

执行结果说明

gitee 对密码做了特殊加密,所以登录会失败,但是这也说明 gitee 已经收到了请求,只是判断登录不成功而已。

举例:

public String postContent(String url, Map<String, String> formData) {
// okHttpClient 实例
OKHttpClient okHttpClient = new OkHttpClient();
//post方式提交的数据
Builder builder = new FormBody.Builder();
// 放入表单数据
for (String key: formData. keySet(){
builder. add (key, formData. get(key));
}
// 构建 FormBody 对象
FormBody formBody = builder.build();
// 指定 post 方式提交FormBody
Request request = new Request.Builder().url(url).post(formBody).build();
// 使用client去请求
Call call = okHttpClient.newCall (request);
// 返回结果字符串
String result = null;
try {
// 获得返回结果
result= call. execute().body().string();
}
catch (I0Exception e) {
// 抓取异常
System.out.println("request" + url + " error . ");
e. printStackTrace();
}
return result;
}

public static void main (String[] args) {
String url = "https://gitee.com/login";
FormPoster poster = new FormPoster();
Map<String, String> formBody = new HashMap<>();
formBody. put("user [login]", "17177456748");
String content = poster.postContent(url, formBody);
System.out.println("API调用结果");
System. out. println(content);
}

POST JSON 数据

在日常开发工作中,除了提交表单数据,也经常用到提交 JSON 数据。

跟表单数据提交方法一样,也是调用 post() 方法,只是参数不再使用 FormBody 对象,而是使用 RequestBody

示例

下列程序演示用 JSON 方法提交数据,注册一个新用户,数据包括:

数据名数据值
name张飞
secondName

翼德

首先我们需要添加一个依赖:

<!-- JSON 操作库-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactld>fastjson</artifactld>
<version>1.2.62</version>
</dependency>

代码示例:

package com.youkeda.test.http;
import com. alibaba. fastjson.JSON;
import okhttp3.*;
import java.io. IOException; 
import java.util.HashMap;
import java.util.Map;

public class JsonPoster {
private static final MediaType JSON_TYPE = MediaType.parse("application/json; charset=utf-8");
/**
* 向指定的 UPL 提交数据
*/
public String postContent(String url, Map<String, String> formData) {
// okHttpClient 实例
OkHttpClient okHttpClient = new OkHttpClient();
// key-value
String param = JSON. toJSONString (formData);
RequestBody cequestBody = RequestBody create (JSON_TYPE, param) ;
// 指定 post 方式提交FormBody
Request request = new Request. Builder().url(url).post(requestBody).build();
// 使用client去请求
Call call = okHttpClient.newCall(request) ;
// 返回结果字符串
String result = null;
try{
//获得返回结果
result = call. execute().body) .string();
} catch (IOException e)
{
// 抓取异常
System.out.println("request"+ url +" error. ");
e. printStackTrace() ;
}
return result;
}
public static void main (String[] args) {
String url ="https://www.fastmock.site/mock/3d95acf3f26358ef032d8a23bfdead99/api/posts";
JsonPoster poster = new JsonPoster();
Map<String, String> datas = new HashMap<>();
datas.put("name","张飞");
datas.put ("secondName"
,"翼德");
String content = poster postContent(url, datas);
System.out.println("API调用结果") :|
System.out. println(content);
}
}

从 console 打印结果可以看到,服务器注册成功,并生了新用户的 id 号。

详解

实现 JSON 方式提交数据的步骤:

  1. 将数据转换成 JSON 格式的字符串,调用 JSON.toJSONString() 方法即可。
  2. 创建 RequestBody 实例,注意需要指定提交的类型是 application/json; charset=utf-8 。这里的 utf-8 是 API 规定的编码格式。
  3. 构建 Request 实例对象时,调用 .post(requestBody) 即表示使用 JSON 的方式提交数据。

这些基本上都是固定写法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/897509.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

08 实战:色彩空间展示(本程序以视频为主)

程序效果如下: 我在这里讲解RGB和YCbCr的原理: 一、RGB颜色空间 1.1 基本概念 RGB颜色空间是一种最基础和常用的颜色表示方式,它基于人眼感知色彩的三原色原理。RGB分别代表: R(Red):红色G(Green):绿色B(Blue):蓝色通过这三种基本颜色的不同组合,可以产生人眼…

计算机毕业设计Spark+大模型动漫推荐系统 动漫视频推荐系统 漫画分析可视化大屏 漫画爬虫 漫画推荐系统 漫画爬虫 知识图谱 大数据

《Spark大模型动漫推荐系统》开题报告与任务书 一、引言 随着互联网技术的飞速发展&#xff0c;动漫产业的数据量急剧增长。用户面临着海量动漫作品的选择难题&#xff0c;如何从这些数据中高效地提取有价值的信息&#xff0c;为用户推荐符合其喜好的动漫作品&#xff0c;成为…

如何快速生成大量有意义的测试数据?

如何获取 MySQL 的测试数据&#xff0c;这是个很经典的问题&#xff0c;在开发、测试和性能优化的各个环节中&#xff0c;获取合适的测试数据都是必不可少的。MySQL 官方还特地提供了示例库 employees&#xff0c;用于测试用途&#xff0c;但 employees 并不是万能的&#xff0…

为您的 WordPress 网站打造完美广告布局 A5广告单元格插件

一个为 WordPress 网站量身定制的强大工具,它将彻底改变您展示广告的方式 灵活多变的布局设计 A5 广告单元格插件的核心优势在于其无与伦比的灵活性。无论您是想要创建整齐的网格布局,还是希望打造独特的不规则设计,这款插件都能满足您的需求。 自定义网格数量&#xff1a;从 2…

vue 页面导出gif图片 img 导出gif 超简单~ 可修改播放速度

1.首先需要新建一个文件件 新建gif文件夹。这两个文件在文章最后面需要可自提 2.出gif分为两种情况 第一种情况 页面是img标签&#xff0c;直接导出图片作为gif 第二种情况 页面是div标签&#xff0c;需要导出div里面的图片作为gif 2.1页面是img标签&#xff0c;直接导出图…

博弈论:博弈类型空间集合;三层博弈拓展式;

目录 博弈论:博弈类型空间集合 θ(Dss-1=1 )就是博弈类型空间集合; 一、博弈的基本要素 二、博弈的主要类型 三、博弈类型空间集合的构建 三层博弈拓展式: 博弈论:博弈类型空间集合 这的博弈类型空间集合:指一方选择的策略,用符号进行表达:SDss-2(θDss-1=1) = …

手机玩使命召唤21:黑色行动6?GameViewer远程玩使命召唤教程

使命召唤21&#xff1a;黑色行动 6这个第一人称射击游戏&#xff0c;将于10月25号上线&#xff01;如果你是使命召唤的老玩家&#xff0c;是不是也在期待这部新作&#xff1f;其实这个游戏不仅可以用电脑玩&#xff0c;还可以用手机玩&#xff0c;使用网易GameViewer远程就能让…

Golang | Leetcode Golang题解之第502题IPO

题目&#xff1a; 题解&#xff1a; func findMaximizedCapital(k, w int, profits, capital []int) int {n : len(profits)type pair struct{ c, p int }arr : make([]pair, n)for i, p : range profits {arr[i] pair{capital[i], p}}sort.Slice(arr, func(i, j int) bool {…

FileLink跨网文件摆渡系统:重构跨网文件传输新时代

在数字化浪潮的推动下&#xff0c;企业对于数据的高效利用和安全管理提出了前所未有的要求。面对不同网络环境间的文件传输难题&#xff0c;传统方法往往显得力不从心&#xff0c;不仅效率低下&#xff0c;还存在极大的安全隐患。而FileLink跨网文件摆渡系统的出现&#xff0c;…

http服务器的实现和性能测试

http服务器的实现 本文使用上一篇博文实现的epollreactor百万并发的服务器实现了一个使用http协议和WebSocket协议的WebServer。 完整代码请看我的github项目 1. 水平触发(Level Trigger)与边沿触发(Edge Trigger) 1.1 水平触发 水平触发是一种状态驱动机制。当文件描述符&a…

【学习AI-相关路程-mnist手写数字分类-python-硬件:jetson orin NX-自我学习AI-基础知识铺垫-遇到问题(1) 】

【学习AI-相关路程-mnist手写数字分类-python-硬件&#xff1a;jetson orin NX-自我学习AI-基础知识铺垫-遇到问题&#xff08;1&#xff09; 】 1、前言2、先行了解&#xff08;1&#xff09;学习基础知识-了解jetson orin nx 设备&#xff08;2&#xff09;学习python&AI…

AUTOSAR_EXP_ARAComAPI的6章笔记(2)

☞返回总目录 相关总结&#xff1a;AutoSar AP CM实例说明符的使用方法总结 6.2 实例说明符的使用方法 一、InstanceSpecifier 的概念 InstanceSpecifier 是在 [3] 中定义的一个核心概念&#xff0c;它由符合特定模型元素绝对路径的模型元素 shortName 组成&#xff0c;表现…

自定义中文排序在Java中的实现与注意事项

目录 前言1. 基本知识2. 实战 前言 #1024程序员节 | 征文# 对于Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 原先的Java中文…

Ubuntu(22.04)本地部署Appsmith

Ubuntu&#xff08;22.04&#xff09;安装Appsmith 简要介绍 Appsmith 是一个开源的低代码开发平台&#xff0c;旨在帮助开发者和非开发者快速构建定制化的内部应用程序和管理工具。通过直观的拖拽界面和丰富的预配置组件&#xff0c;Appsmith 让用户无需编写大量代码即可创建…

【C++】string类(2)

&#x1f973;个人主页: 起名字真南 &#x1f973;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 引言1 模拟实现string类基本框架2 实现string类中的主要成员函数2.1 Push_Back 函数2.2 reserve 函数2.3 append 函数2.4 c_str 函数2.5 begin ,end 函数2.5 operator 函数2.6…

IDEA开发工具使用技巧积累

一、IDEA 工具设置默认使用maven的settings.xml文件 第一步&#xff1a;打开idea工具&#xff0c;选中 File ——> New Projects Setup ——> Settings for New Projects 第二步&#xff1a;先设置下自动构建项目这个选项 第三步&#xff1a;选中 Build Tools ——>…

word删除空白页 | 亲测有效

想要删掉word里面的末尾空白页&#xff0c;但是按了delete之后也没有用 找了很久找到了以下亲测有效的方法 1. 通过鼠标右键在要删除的空白页面处显示段落标记 2. 在字号输入01&#xff0c;按ENTER&#xff08;回车键&#xff09; 3.成功删除了&#xff01;&#xff01; PS…

Selenium爬虫技术:如何模拟鼠标悬停抓取动态内容

介绍 在当今数据驱动的世界中&#xff0c;抓取动态网页内容变得越来越重要&#xff0c;尤其是像抖音这样的社交平台&#xff0c;动态加载的评论等内容需要通过特定的方式来获取。传统的静态爬虫方法难以处理这些由JavaScript生成的动态内容&#xff0c;Selenium爬虫技术则是一…

基于SSM大学校医院信息管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;校医管理&#xff0c;用户管理&#xff0c;在线问诊管理&#xff0c;线上挂号管理&#xff0c;病例记录管理&#xff0c;系统管理 校医账号功能包括&#xff1a;系统首页&#xff0c;个人中心&#xf…

用Java爬虫API,轻松获取taobao商品SKU信息

在电子商务的世界里&#xff0c;SKU&#xff08;Stock Keeping Unit&#xff0c;库存单位&#xff09;是商品管理的基础。对于商家来说&#xff0c;SKU的详细信息对于库存管理、价格策略制定、市场分析等都有着重要作用。taobao作为中国最大的电子商务平台之一&#xff0c;提供…