通过GET/POST方式获取第三方接口的数据

前言

遇到一个项目,需要通过API去获取数据,API接口的调用方式支持GET和POST。一开始不懂这个API具体是个啥,是需要我们自己设计还是说用户给定,后续搜索明确是用户自定义提供API接口,开发人员只需要获取到API的url及调用这个API所需要的必要参数,然后分别以GET/POST方式连接API,通过API获取数据返回即可。这块对我来讲是个新知识点和新的处理方式,所以进行简单记录。

参考链接

  • GET/POST方式调用HTTP接口:https://blog.csdn.net/CapMiachael/article/details/51833531?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
  • 调用第三方接口获取数据:https://blog.csdn.net/myme95/article/details/89359677?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
  • 免费API获取网站:https://www.apishop.net/#/

实现过程

1.1 确定测试的接口及相关参数

本次测试使用笑话大全API,接口URL及需要给定的参数见下图:

通过GET/POST方式获取第三方接口的数据_第1张图片

由上图的请求示例可知访问这个API支持通过GET和POST方式访问符合我们的要求。调用API需要url和请求参数,这个示例API需要的请求参数是apiKey和pagaSize,在网站中申请获取apiKey,pageSize自定义即可。

下图为网站自带的API获取数据的功能。

通过GET/POST方式获取第三方接口的数据_第2张图片通过GET/POST方式获取第三方接口的数据_第3张图片

1.2 通过GET方式获取API接口数据(代码参考链接,具体更多处理方法见上述链接)

在确定好API链接及参数后,设计实现GET方式获取API数据

        //输入字符缓冲流
        BufferedReader in = null;
        //StringBuffer存储获取到的数据
        StringBuffer result = null;
        //调用的api的接口地址和接口参数
        String apiUrl = apiPath+"?"+param;
        try {
            URL url = new URL(apiUrl);
            //打开和url之间的连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            //有关connection的通用配置
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestProperty("Charset", "utf-8");
            //设置连接方式为GET
            connection.setRequestMethod("GET");
            connection.connect();
            result = new StringBuffer();
            //读取连接输入,使用默认utf-8的转换输入流,使用BufferedReader缓冲区提升读取IO效率且readLine方法支持一次读取一行
            in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            //读取字符输入缓冲流获取读取到的数据并存储result中
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
            return result.toString(); 
         //catch+finally部分
        

1.3 通过POST方式获取API接口数据

        BufferedReader in = null;
        //输出流,用来输出接口的参数
        OutputStreamWriter out = null;
        StringBuffer result = null;
        //调用的api的接口地址
        String apiUrl = apiPath;
        try {
            URL url = new URL(apiUrl);
            //打开和url之间的连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestProperty("Charset", "utf-8");
            //POST方式必要的配置
            connection.setDoInput(true);
            connection.setDoOutput(true);
            //设置连接方式为POST
            connection.setRequestMethod("POST");
            connection.connect();
            // 获取URLConnection对象对应的输出流,并用OutputStreamWriter转换输出流,规定编码规则为utf-8
            out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
            // 发送API请求参数
            out.write(param);
            // flush输出流的缓冲
            out.flush();
            result = new StringBuffer();
            //读取URL的响应,规定转换输入流编码默认为utf-8
            in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
            return result.toString();
            //catch+finally部分

1.4 分别测试GET方式和POST方式都成功获取到了API的数据。结果如下

其中接口url和参数为

测试成功,功能实现。

1.5 观察输出结果,我们只需要result,使用fastJson将String转为JSON并使用JSONObject类的静态方法getJSONObject单纯获取result结果。

        //将String转为JSON格式
        JSONObject jsonObject = JSON.parseObject(result);
        //将JSON中的result提取出来
        JSONObject jsonResult = jsonObject.getJSONObject("result");
        System.out.println(jsonResult);

测试结果如下,由于上面给的接口测试机会用完,此处测试使用新申请的接口。

知识点总结:

1. URL类:类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。

通过GET/POST方式获取第三方接口的数据_第4张图片通过GET/POST方式获取第三方接口的数据_第5张图片

2. URLConnection类:代表应用程序和 URL 之间的通信链接。

通过GET/POST方式获取第三方接口的数据_第6张图片通过GET/POST方式获取第三方接口的数据_第7张图片通过GET/POST方式获取第三方接口的数据_第8张图片通过GET/POST方式获取第三方接口的数据_第9张图片通过GET/POST方式获取第三方接口的数据_第10张图片

3. HttpURLConnection类:支持 HTTP 特定功能的 URLConnection。每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络。请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例关联的网络资源,但对共享的持久连接没有任何影响。如果在调用 disconnect() 时持久连接空闲,则可能关闭基础套接字。

通过GET/POST方式获取第三方接口的数据_第11张图片

拓展

后续接触到RestTemplate这个类,springboot下专门用于发送和接收HTTP请求的类,参考学习链接:https://www.cnblogs.com/javazhiyin/p/9851775.html

总结

拿到问题先搞懂里面不懂的名词,之后分析搜索解决问题并及时进行总结。

你可能感兴趣的:(后端开发,Java学习)