我们在使用别人实现的一些API接口时,应该如何调试?当我们使用的API返回一些意想不到的错误时,我们应该怎么办?这个问题可能是由用户输入或API本身引起的,也可能是完全不相关的。调试是我们定位和修复由单个API调用或一系列调用引起的问题的地方。通常,我们可以调试我们没有完全掌握的代码,从而清楚地了解那部分代码。我们在使用API的时候,除了会遇到意想不到的异常,在解析输出或者传递变量的过程中也可能会出现错误。在本文中,我们将深入探讨快速可靠地调试RESTAPI的方法和原则。API调试到底是什么?调试的目的是弄清楚输入输出的关系。通常,问题的根本原因是根据可观察到的现象来定位的。但是当我们同时使用不同服务商提供的API或者不同的API资源时,可能会增加我们调试的难度。理想情况下,我们会使用一个强大的测试和监控系统,它会在出现问题时提醒我们,并帮助我们初步确定问题发生的原因。同时,即使您没有这么高级别的监控系统,一些常用的有效方法也可以帮助我们减少查找和修复问题所需的时间和精力。下面一栏是定位问题的方法:先定位出问题的API检查状态信息更深入地检查数据接下来我会用Postman来演示这个调试方法,不过这个方法也可以应用到其他的开发工具。1.定位API第一步是定位引起问题的API,确定问题确实是API的调用引起的,或者是API本身,或者是API内部的处理过程,或者完全是什么东西无关。复现问题,深入定位问题,以便进一步分析问题。同时,我们还可以调整传递给API的输入参数,分析输出信息。如果此方法仍然无法辨别输入和输出之间的关系,那么问题可能不是API调用本身,而是其他原因,例如第三方服务或基础设施的变化导致了意外行为。图1重现问题,以便进行深入分析2.查看状态码当我们通过API进行交互时,服务器会返回一个HTTP状态码,表示我们API请求的状态。状态代码和错误消息由API提供者确定,因此它们的含义和准确性会有所不同。但是,大多数API提供者通常使用状态代码的第一个数字来反映响应类。例如400表示客户端有问题,更新请求可以解决问题;500表示服务器有问题。除了访问适当的资源并检查它之外,API的实现者可以做的事情不多。服务器返回的可靠状态消息是我们了解错误来源的第一条线索。以下是一些常见的客户端错误码,这里我解释一下相应的解决方法:400表示请求参数错误,我们可以检查语法错误,比如输入错误或者JSON文本格式错误。401表示未授权,我们需要确认是否有有效的认证凭证才能访问对应的目标资源,确认没有语法问题。403表示服务器拒绝请求。这个时候,我们可以检查一下我们所拥有的权限和范围,确保我们有权访问资源。418表示I'maTeapot(我是一个茶壶),可能表示该请求是提供者不想处理的请求,例如自动查询。429表示请求过多,这时候我们可以查看文档了解使用频率限制或者稍后再试。图2使用4开头的错误码表示客户端异常。3.深入分析下一步是深入挖掘并验证我们的假设。我们可以验证每个请求都被正确发送,每个响应都被正确解析。当我们沿着API调用序列传递数据时,我们还可以验证变量是否被正确定义和引用。以下是处理HTTPAPI时的一些常见问题:MalformedJSON:新手在发送JSON时常犯的一些错误。在JSON字符串中,单引号是无效的,因此请确保将字符串和属性名称用双引号引起来。此外,JSON不支持注释,因此要么尽可能简单,要么根本不添加注释。序列化数据:RESTAPI通常以JSON对象的形式存储和发送数据。为了正确传输数据,请确保使用JSON.stringify()对数据进行编码并使用JSON.parse()对其进行解码。此外,服务器可能会要求您设置类型为application/json的Content-Type标头。进一步检查后,如果看到[objectobject]或Unexpectedtoken这样的值,这表明我们在非法序列化和反序列化。类型转换:准备发送请求或解析响应时,您可以将值从一种类型转换为另一种类型。根据编程语言的不同,对字符串进行数学计算可能会失败,但是当我们将字符串转换为数字时,可以处理转换后的数据。提取信息:使用JSON.parse()反序列化JSON响应后,可以使用点或括号表示法访问所有信息。如果您试图访问复杂结构中深层嵌套的信息,您可能需要逐步分解它以准确引用该信息并确保您没有尝试使用未定义的内容。认证与授权:认证是指验证用户的身份,而授权是确认用户具有访问资源的权限。如果请求包含适当的授权标头,但您仍然无法访问资源,请仔细检查与凭据关联的权限和范围。内容类型标头:Content-type和Accept标头有助于客户端和服务器之间的内容协商。Content-type请求头告诉服务器客户端发送的信息类型。Accept请求标头告诉服务器客户端可以理解什么类型的内容。一些API需要特定的请求标头并且只处理特定的内容类型。对于这些常见的错误,可以依靠语法高亮、检查器等检查功能来帮助我们进行检查。同时,我们可以通过开发者控制台查看应用的网络调用和日志语句,这可以帮助我们根据一次调用到另一次调用的输入、输出和传递的数据来定位问题。例如,如果你有一个同步或异步调用序列,记录关键节点的值或设置条件断点以进一步快速定位问题。在整个调用执行过程中使用控制台语句(如console.log())可以进一步验证我们假设的解析输出。图3使用控制台调整策略定位问题许多调试策略有助于缩小问题原因的范围。这些策略大致分为三类。1.蛮力策略如果您分析系统的方法有限,则意味着您需要调整和记录所有内容。在整个API调用序列的某些点添加战略日志记录语句会很有帮助。但是,大量日志会降低性能,因为需要更多时间来处理日志数据。2.回溯策略该策略是从最先发现错误的地方向后移动,直到找到错误的根本原因。同样,可以从表现出预期行为的API调用开始,然后逐步执行后续调用,直到找到错误。当您对可能导致问题的原因有一个合理的假设时,此策略会很有效,否则它就不会那么有效。3、一个一个分解在一个复杂的系统中,将系统分解成更小的部分,可能会让我们更容易发现问题。二进制搜索是这种策略的一个例子,你在一长串调用中输入一个日志语句或断点,如果在断点之前没有出现错误,则对下半部分重复该过程,依此类推。另一种策略是使用模拟服务器来隔离被测系统。您可以依赖外部依赖项的模拟响应,或为您的场景提供起点。保持调试心态一段时间后,专注于一个问题却没有进展,可能会失去定位问题的信心,因为此时我们毫无头绪。下面的策略可以帮助您获得更有效的调试思维。橡皮鸭调试:向他人阐明问题和假设可能会迫使您坐下来明确陈述您的假设,从而改变您自己的观点。从专注模式切换到发散模式:完全切换到不同的活动,如远足,会让你的大脑进入不同的状态。扩散学习模式是指您的大脑被动地建立新的联系,从而产生创造性的见解。这就是为什么您最好的想法会在淋浴时或您第一次醒来时出现。在调试时节省时间和精力无论您是使用RESTAPI的新手还是经验丰富的老手,一致且有条理的调试方法都可以节省时间和精力。您选择的调试策略取决于系统的可观察性。如果您的系统受到预定义日志和堆栈跟踪的广泛监控,您可以快速发现问题并立即发现错误。如果这些措施没有到位,您可以简化问题以减少搜索范围,并利用其中一些调试策略来定位根本原因。原文链接:https://stackoverflow.blog/2022/02/28/debugging-best-practices-for-rest-api-consumers/
