调试别人的API,一般有哪些步骤?

news2024/11/23 11:48:14

当我们使用了一些由别人实现的API接口时,该如何进行调试呢?当我们使用的API返回一些意想不到错误时,该怎么办呢?这个问题可能是由于用户输入或者API本身,或者其他完全无关的内容等引起的。调试是我们进行定位并修复由单个API调用或一系列调用引发的问题。通常,我们可以调试我们不能完全把握的代码,从而可以清晰地了解该部分代码。我们在使用API时,除了遇到意想不到的异常外,还有可能在解析输出或传递变量时出错。

在本篇文章中,我们将深入研究快速地、可靠地调试REST API的方法和原则。

API debugging到底是什么

调试的目的是为了梳理清楚输入和输出之间的关系。通常都是基于可观察到的现象来定位问题的根本原因。但当我们同时使用了不同服务商提供的API或者不同的API资源时,就可能会加大我们调试的难度。

理想情况下,我们会使用一个稳定的测试和监控系统,当问题出现时,这个系统可以提醒我们,并且帮我们初步确定出现该问题的原因。同时即使您没有这种高级别的监控系统时,一些常见的有效的方法也可以帮助我们减少查找和修复问题所需的时间和精力。

下面列是一种定位问题的方法:

  • 先定位因为引起该问题的API

  • 检查状态信息

  • 更深入地检查数据

接下来,我将会使用Postman来演示这种调试方法,但这种方法同样可以适用于其他的开发工具的。

1、定位API

第一步就是定位出引起问题的API,并确定该问题确实是因为该API的调用,或者API本身,或API内部处理过程,或者是完全无关的东西导致的。重新复现问题并深入定位该问题,从而方便我们进一步分析问题,同时我们还可以调整传递给该API的输入参数,并分析输出信息。如果通过该方法依然无法辨别输入和输出之间的关系,那么问题可能不是出在API调用本身,而是其他原因导致的,比如第三方服务或基础架构的更改导致了这种意想不到的行为。 

2、检测状态码

当我们通过API进行交互时,服务器会返回一个HTTP状态码,该代码表示我们API请求的状态。这个状态码和错误消息由API提供者确定,因此它们的意义和准确性各不相同。但是大多数API提供方通常会使用状态代码的第一个数字来反应响应类,如400表示客户端有问题,此时更新请求可以解决该问题;500表示服务器有问题,此时我们除了验证正在访问适当的资源并进行检查之外,没有什么可以做的了,除非是API的实现方。

服务器返回可靠的状态消息是我们追踪错误来源的第一线索。以下是一些常见的客户端错误代码,再此处我分别说明了对应的解决方法:

 

3、深入分析

下一步是深入挖掘并验证我们的假设。我们可以验证是否正确地发送了每个请求,并正确地解析了每个响应。当我们沿着API调用序列传递数据时,还可以验证变量的定义和引用是否正确。

以下是处理HTTP api时常见的问题:

  • 畸形的JSON:新手在发送JSON时会犯一些常见的错误。在JSON字符串中,单引号无效,因此请确保将字符串和属性名用双引号括起来。此外,JSON不支持注释,所以要么尽量简化,要么根本不添加它们。

  • 序列化数据:REST api经常以JSON对象的形式存储和发送数据。为了正确传输数据,请确保使用JSON.stringify()对数据进行编码,并使用JSON.parse()对其进行解码。此外,服务器可能要求您设置一个application/json类型的Content-Type头。进一步检查后,如果您看到像[object object]或Unexpected token这样的值,这表明我们非法的进行了序列化和反序列化。

  • 类型转换:在准备发送请求或解析响应时,可以将值从一种类型转换为另一种类型。根据编程语言的不同,对字符串执行数学计算可能会导致失败,但当我们将字符串转换为数字时,就可以处理转换后的数据了。

  • 提取信息:使用JSON.parse()反序列化JSON响应后,就可以使用点或括号符号访问所有信息。如果您试图访问一个复杂结构中的深层嵌套信息,您可能需要一步一步地将其分解,以精确地引用该信息,并确保您不会试图使用到一些未定义的东西中。

  • 身份验证与授权:身份验证是指验证用户的身份,而授权则确认用户拥有访问资源的权限。如果请求中包含了适当的授权头,但仍然不能访问资源,请仔细检查与凭据相关的权限和作用域。

  • Content type头:Content- type和Accept头有助于在客户端和服务器之间进行内容协商。Content-type请求头告诉服务器,客户端发送的信息类型。而Accept请求头告诉服务器,客户机可以理解什么类型的内容。一些api需要特定的请求头,并且只处理特定的内容类型。

对于这些常见的错误,可以依靠语法高亮显示、检查器和其他检查功能来帮我们来检查。同时我们可以利用开发人员控制台来查看应用程序的网络调用和日志语句,从而可以根据其提供的输入、输出和从一个调用到另一个调用传递数据来帮助我们定位问题,例如,如果您有一个同步或异步调用序列,记录关键结点的值或设置条件断点来进一步快速查明问题所在。在整个调用执行过程中使用console.log()这样的控制台语句可以进一步验证我们的假设解析输出。

调整策略

许多调试策略有利于缩小问题的原因。这些策略大致可分为三类。

1、蛮力策略

如果您对系统的分析方法有限,这意味着您需要调整并记录所有内容。在整个API调用序列的某些点上添加战略日志语句可能会很有帮助。但是,大量的日志会降低性能,因为需要更多的时间来处理日志数据。

2、回溯策略

这种策略是指从第一次发现错误的地方向后移动,直到找到错误的根本原因。类似地,可以从显示预期行为的API调用开始,然后逐步执行后续调用,直到找到错误。当您对可能导致问题的原因有合理的假设时,这种策略很有效,否则这种策略就不那么有效了。

3、逐个各个击破

在复杂的系统中,将系统分解成更小的部分可能会让我们更容易发现问题。二进制搜索就是这种策略的一个例子,在这种情况下,您可以在一个较长的调用序列中输入一个日志语句或断点,假如直到该断点处时有没有出现缺陷,则对调用的后半部分重复该过程,以此类推。另一种策略是使用模拟服务器来隔离被测试的系统。您可以依赖模拟响应来获得外部依赖项,或者为您的场景提供一个起点。

保持调试的心态

一段时间后,专注于一个问题而没有取得进展可能会对自己丧失定位问题的信心,因为此时我们已经没有任何头绪了。下面的策略可以帮助您获得更有效的调试心态。

  • 橡皮鸭调试(Rubber duck debugging):向别人阐明问题和假设可能会迫使你静下心来,明确地陈述你的假设,从而改变你自己的观点。

  • 从集中模式切换到分散模式(Switch from a focused to diffused mode):完全切换到不同的活动,比如徒步旅行,会让你的大脑进入一个不同的状态。扩散学习模式是当你的大脑被动地建立新的联系,并可能导致创造性的见解。这就是为什么你在洗澡的时候或者刚醒来的时候会有最好的想法的原因。

在调试时节省时间和精力

无论您是使用REST api的新手还是经验丰富的老手,一致和有条理的调试方法可以节省时间和精力。您选择的调试策略取决于系统的可观察性。如果您的系统使用预定义的日志和堆栈跟踪进行了广泛的监视,那么您可以迅速发现问题,并可能立即发现错误。如果这些措施没有到位,您可以简化问题以减少搜索区域,并利用其中一些调试策略来定位根因。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

漫天花雨HTML特效+3D相册

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

软件工程期末复习(背题家速成)

文章目录 前言一、选择题1、第一章 软件工程综述2、第二章 软件过程3、第三章 可行性研究4、第四章 结构化需求分析5、第五章 结构化软件设计6、第六章 面向对象的需求分析7、第七章 第7章面向对象设计8、第八章 基于构件的开发9、第九章 软件项目的测试10、第十章 软件实施、维…

每天一道算法练习题--Day2 第一章 --算法专题 --- ----------位运算

我这里总结了几道位运算的题目分享给大家,分别是 136 和 137, 260 和 645, 总共加起来四道题。 四道题全部都是位运算的套路,如果你想练习位运算的话,不要错过哦~~ 前菜 开始之前我们先了解下…

Umi 插件实战教程

引言 笔者最近开发了一款 umi 插件:plugin-umi-cmdk[1],该插件的功能主要是:在 umi 项目里可以方便的集成 cmd k ,实现菜单等搜索。 主体功能并不复杂,但是在集成作为 umi 插件过程中踩了不少坑,主要是 umi 官方文档的…

【计算机网络】面试高频问题汇总及详细解答

【C语言部分】面试高频问题汇总及详细解答 【操作系统(Linux)】面试高频问题汇总及详细解答 【数据库】面试高频问题汇总及详细解答 本文目录 1. 简述网络七层参考模型及每一层的作用2. 简述静态路由和动态路由3. 说说有哪些路由协议,都是如何更新的4. 简述域名解析…

PostgreSQL Explain 复杂执行计划怎么看 --- 逐个分解PG执行计划的那些操作

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

Codeforces-Round-805-Div-3-E-Split-Into-Two-Sets

title: Codeforces Round 805 (Div. 3) E. Split Into Two Sets date: 2023-04-25 18:14:41 categories: AlgorithmCodeforces tags:codeforces并查集1600 E. Split Into Two Sets 题目大意 给你n组数,每组里面有两个数字,问你能不能把这n组数分为两组…

【数据架构系列-06】一文搞懂数据模型的3种类型——概念模型、逻辑模型、物理模型

数据模型就是模拟现实世界的方法论,是通向智慧世界的基石! 从现实世界发展到智慧世界,要数经历现实世界、信息世界、计算机世界、数据世界、智慧世界五个不同的世界,我们天生具有从混沌的世界抽象信息变为信息世界的能力&#xff…

基于jenkinsfile布置java工程

需求 通过jenkins发布java项目到服务器 预备环境 项目地址: https://gitee.com/asaland/sb-docker-appJenkins 2.387.3 通过Jenkinsfile实现方式 jenkins ui 配置pipeline 什么是pipeline? 直接看注释吧,简单点就是编排可以多个跨时间的构建代理…

JavaScript全解析——canvas 绘制变换和渐变

绘制变换 ●在 cancas 内, 也可以向 css 中一样, 出现一些 2d 变换的效果 ●先来绘制一个基本矩形 // 0. 获取到页面上的 canvas 标签元素节点 const canvasEle document.querySelector(#canvas)// 1. 获取当前这个画布的工具箱 const ctx canvasEle.getContext(2d)// 2. 绘…

ip数据报计算首部检验和

当我们在使用互联网进行数据传输时,数据可能会被篡改或者损坏。为了保证数据传输的可靠性和完整性,计算IP数据包首部检验和是一种非常重要的校验机制。本文将会介绍计算IP数据包首部检验和的方法。 IP数据包首部 首先,我们需要了解IP数据包…

5 系统数据文件和信息

5.1 口令文件 口令文件包含了下表中所示的各字段&#xff0c;这些字段包含在<pwd.h>中定义的passwd结构中。 /etc/passwd文件中的字段 说 明struct passwd 成员用户名char *pw_name加密口令char *pw_passwd数值用户IDuid_t pw_uid数值组IDgid_t pw_gid注释字段char *pw_g…

Unity实现GPU Cull渲染

前言 开放世界游戏中植被和物件的数量往往是巨大, 而传统组织大量植被渲染的方式是利用QuadTree/Octree/Kd-Tree等数据结构对植被Intance数据进行预先生成一个个Cluster&#xff0c;然后在运行时进行FrustumCull,收集可视的所有Cluster&#xff0c;最后进行DrawInstance. 这…

Yolov1 源码讲解 loss.py

结构 1.lt rb我觉得不是很合适 正确来说是lb rt 因为比较出来的都是左下和右上坐标 比如前两个&#xff0c;都是max出来的 选两个box左下坐标中最大的&#xff0c; 后两个则是右上坐标中最小的 那也就形成了交集面积 但是代码中仍然是lt rb我也就直接这样说 而算出lt和r…

zynq基于XDMA实现PCIE X8视频采集HDMI输出 提供工程源码和QT上位机程序和技术支持

目录 1、前言2、我已有的PCIE方案3、基于zynq架构的PCIE4、总体设计思路和方案视频输入通路PCIE数据缓存通路视频输出通路 5、vivado工程详解6、SDK 工程详解7、驱动安装8、QT上位机软件9、上板调试验证10、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Expre…

二叉树的实现

二叉树 文章目录 二叉树背景二叉树的概念遍历方式代码实现 背景 数组存储方式的分析 优点&#xff1a;通过下标方式访问元素&#xff0c;速度快。对于有序数组&#xff0c;还可使用二分查找提高检索速度。 缺点&#xff1a;如果要检索具体某个值&#xff0c;或者插入值(按一…

linux中使用docker部署微服务

目录 一、制作jar包&#xff08;如果看一眼很简单&#xff0c;可以直接使用结尾的jar&#xff09; 1.首先创建一个微服务 demo2 2.启动微服务&#xff08;在DemoApplication上右键执行启动就行&#xff09; 注意&#xff1a;其他操作导致的 可能遇到的报错 3.修改端口 4.新…

ChatGPT的快速发展究竟给我们带来了什么?

&#x1f61a;一个不甘平凡的普通人&#xff0c;致力于为Golang社区和算法学习做出贡献&#xff0c;期待您的关注和认可&#xff0c;陪您一起学习打卡&#xff01;&#xff01;&#xff01;&#x1f618;&#x1f618;&#x1f618; &#x1f917;专栏&#xff1a;算法学习 &am…

java基础入门-05-【面向对象进阶(static继承)】

Java基础入门-05-【面向对象进阶&#xff08;static&继承&#xff09;】 13、面向对象进阶&#xff08;static&继承&#xff09;1.1 如何定义类1.2 如何通过类创建对象1.3 封装1.3.1 封装的步骤1.3.2 封装的步骤实现 1.4 构造方法1.4.1 构造方法的作用1.4.2 构造方法的…

Unity API详解——Random类

Random类是Unity中用于产生随机数的类&#xff0c;不可以实例化&#xff0c;只有静态属性和静态方法。本博客主要介绍了Random类的一些静态属性。 文章目录 一、Random类静态属性1、基本语法2、功能说明3、代码实现 二、rotationUniform属性1、基本语法2、功能说明1、规范化向量…