我正在评估Axios,有一件事我似乎不知道如何强制执行响应是JSON。从我收集的信息来看,Axios会根据内容类型(https://stackoverflow.com/a/65976510/1103734)自动为我们解析JSON。然而,我希望实际强制执行响应是JSON(例如,如果我的nginx代理由于下游错误而返回HTML,我希望处理这个问题)。
我注意到Axios request config有一个responseType
属性,但据我所知,这并不用于实际强制返回预期类型。
axios.get('http://cataas.com/cat?html=true', {responseType: "json"})
.then(res => console.log(`Response:\n ${res.data}`))
.catch((err) => console.log(`Error: ${err}`))
输出:
Response:
<!DOCTYPE html>
<html lang="en">
<header>
<meta charset="utf-8">
</header>
<body>
<img alt="GRxZb4kUHleQ3LhC" src="/cat/GRxZb4kUHleQ3LhC">
</body>
</html>
我能找到的最好的方法是将JSON.parse
放在transformResponse
属性中,但这意味着如果在解析具有错误状态代码的响应时出错,我将在catch
中丢失该状态代码信息。
axios.get('http://cataas.com/cat?html=true', {responseType: "json", transformResponse: JSON.parse})
.then(res => console.log(`Response\n ${res.data}`))
.catch((err) => console.log(`Error: ${err}`))
输出(显然,SyntaxError
不包含任何关于响应的信息):
Error: SyntaxError: Unexpected token < in JSON at position 17
有没有一个好的方法来实现我想要的?
2条答案
按热度按时间uxh89sit1#
我认为术语“JSON”存在一些混淆
我想你的意思是你希望Axios的结果是一个Javascript * 对象 *,而不是一个JSON字符串。这种混淆很常见,因为我们经常把Javascript对象称为“JSON对象”作为俚语。
如果您在控制台中输入以下内容,则
a
的结果值将是一个Javascript对象:有些人会称
a
为JSON对象,但严格来说它不是。a
的JSON表示如下 string:Axios返回给你的不是JSON字符串,而是Javascript * 对象 *
这包含了各种各样的信息,在对象的不同属性中。对我们来说重要的是:
data
是Javascript对象,则以“application/json”开始,如果data
是HTML响应,则以“text/html”开头。下面是显式显示服务器响应的 content-type 的代码。
一个二个一个一个
http://cataas.com/cat?html=true
API返回HTML字符串Axios忠实地在
data
属性中提供该字符串。https://dummyjson.com/products/1
API返回 *JSON字符串 * 给AxiosAxios会自动将JSON字符串转换为Javascript * 对象 *。
一种实现你想要的方法:
response.headers["content-type"]
application/json
开头,那么您很幸运:只需将response.data
视为Javascript对象text/html
开头,尽管你已经请求了一个JSON,那么就有问题了。你可以将response.data
作为HTML阅读,并查看服务器是否提供了任何有用的信息。我不喜欢把所有东西都 Package 在一个
try
/catch
中,然后拾取一个失败的JSON. parse。我们已经得到了关于response.data
是否是一个对象的信息,所以让我们使用它。你甚至可以为Axios写一个 Package 器
这样就可以完成上面的任务,所以你只需要写一次代码。
wh6knrhe2#
我想我已经找到了一种方法去做我想做的事
对目前情况的简要总结
1.我使用
transformResponse
做(body) => body
,如this answer所示。这允许响应拦截器实际获取文本响应数据。这是使其工作的关键。1.然后,我将实际的解析延迟到响应拦截器,这允许我手动处理解析的错误。
1.从那里,我可以创建一个包含原始响应的自定义异常,然后在错误处理中使用它。