【发布时间】:2020-07-28 20:58:40
【问题描述】:
我正在使用 fetch 发送 API 请求并返回 JSON 响应。我很难创建缓冲区对象,因此我可以像处理/解析 JSON 响应一样,如果它是包含 JSON 对象的本地文件或变量。以下是我的获取代码(有效):
const fetch = require("node-fetch");
const asset = 'Build_Artifacts'
const url2 = 'http://localhost:8081/service/rest/v1/components?repository='
const myHeaders = {
"Authorization": "Basic token",
"Content-Type": "application/json",
};
const requestOptions = {
method: 'GET',
headers: myHeaders,
redirect: 'follow'
}
const getData = async () => {
const res = await fetch(url2 + asset, requestOptions);
const data = await res.text()
return data
}
getData() // Returns JSON response
来自阅读: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Client-side_web_APIs/Fetching_data How do I read the contents of a Node.js stream into a string variable? https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
我认为我应该创建一个缓冲区对象来将获取响应放入其中。完成此操作后,我应该能够继续操作响应内容。我做了一些新手尝试,并意识到我离得很近。以下是基于上述阅读的新手尝试:
getData().then(data.arrayBuffer().then(function(buffer) {
//do something with the buffered object
}))
//Output when using res.text():
{
"items" : [ {
"id" : "T0lDX0J1aWxkX0FydGlmYWN0czpmODk4YjM5MDNjYjk5YzU5NjgzNTk3ZWRjNWFmZjliYw",
"repository" : "Build_Artifacts",
"format" : "raw",
"group" : "/",
"name" : "05baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36.zip",
"version" : null,
"assets" : [ {
"downloadUrl" : "http://localhost:8081/repository/Build_Artifacts/05baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36.zip",
"path" : "05baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36.zip",
"id" : "T0lDX0J1aWxkX0FydGlmYWN0czphNDc1N2JjYWE2MmI2MzA2MDdlMTA1NGE4NTk1MDQ1OQ",
"repository" : "Build_Artifacts",
"format" : "raw",
"checksum" : {
"sha1" : "040e517528c05ca335a38e98c7ab8673773314bd",
"sha512" : "652e624873da778dce4bc417cacfead12bdd2ad01e9f7f77cba80270caa0f99caa09d4fb53f584a4da9991186f78bd7b55da1e4ed3f22e026b8333dd332b3b83",
"sha256" : "b66805d15702505f708b90f6e1169c79390d59b9f8cadc9ab1852f48eeabbfe2",
"md5" : "60fdd406e026330c2cfbec3e15e05414"
}
} ]
}, {
"id" : "T0lDX0J1aWxkX0FydGlmYWN0czpkMDY0ODA0YThlZDVhZDZlNjhmZGU5MWNmM2NiZTgzMw",
"repository" : "Build_Artifacts",
"format" : "raw",
"group" : "/",
"name" : "15baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36_2.zip",
"version" : null,
"assets" : [ {
"downloadUrl" : "http://localhost:8081/repository/Build_Artifacts/15baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36_2.zip",
"path" : "15baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36_2.zip",
"id" : "T0lDX0J1aWxkX0FydGlmYWN0czpiZTc2NTljNDhiODY4YWQ0YjZiZjIyMDQyMmU5NWM2Ng",
"repository" : "Build_Artifacts",
"format" : "raw",
"checksum" : {
"sha1" : "040e517528c05ca335a38e98c7ab8673773314bd",
"sha512" : "652e624873da778dce4bc417cacfead12bdd2ad01e9f7f77cba80270caa0f99caa09d4fb53f584a4da9991186f78bd7b55da1e4ed3f22e026b8333dd332b3b83",
"sha256" : "b66805d15702505f708b90f6e1169c79390d59b9f8cadc9ab1852f48eeabbfe2",
"md5" : "60fdd406e026330c2cfbec3e15e05414"
}
} ]
}, {
"id" : "T0lDX0J1aWxkX0FydGlmYWN0czplMDE4OGVkMDcyOGZhNjhmNDExNzU2OGU1MjQ2NjZiYg",
"repository" : "Build_Artifacts",
"format" : "raw",
"group" : "/",
"name" : "25baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36_4.zip",
"version" : null,
"assets" : [ {
"downloadUrl" : "http://localhost:8081/repository/Build_Artifacts/25baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36_4.zip",
"path" : "25baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36_4.zip",
"id" : "T0lDX0J1aWxkX0FydGlmYWN0czoyZmZmNTA5YTdjMmE5ZWJlYTRmNDQ1NjJiZmI5N2QxMA",
"repository" : "Build_Artifacts",
"format" : "raw",
"checksum" : {
"sha1" : "040e517528c05ca335a38e98c7ab8673773314bd",
"sha512" : "652e624873da778dce4bc417cacfead12bdd2ad01e9f7f77cba80270caa0f99caa09d4fb53f584a4da9991186f78bd7b55da1e4ed3f22e026b8333dd332b3b83",
"sha256" : "b66805d15702505f708b90f6e1169c79390d59b9f8cadc9ab1852f48eeabbfe2",
"md5" : "60fdd406e026330c2cfbec3e15e05414"
}
} ]
}, {
"id" : "T0lDX0J1aWxkX0FydGlmYWN0czo2NTRiYjdkMGE1OTIxMzg1OWZhMTVkMzNmYWU1ZmY3OA",
"repository" : "Build_Artifacts",
"format" : "raw",
"group" : "/",
"name" : "35baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36_3.zip",
"version" : null,
"assets" : [ {
"downloadUrl" : "http://localhost:8081/repository/Build_Artifacts/35baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36_3.zip",
"path" : "35baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36_3.zip",
"id" : "T0lDX0J1aWxkX0FydGlmYWN0czoyNGMxZmUzMzVkMjY2NTJmZDRjOWZjZWZlYTQ4ODNhOA",
"repository" : "Build_Artifacts",
"format" : "raw",
"checksum" : {
"sha1" : "040e517528c05ca335a38e98c7ab8673773314bd",
"sha512" : "652e624873da778dce4bc417cacfead12bdd2ad01e9f7f77cba80270caa0f99caa09d4fb53f584a4da9991186f78bd7b55da1e4ed3f22e026b8333dd332b3b83",
"sha256" : "b66805d15702505f708b90f6e1169c79390d59b9f8cadc9ab1852f48eeabbfe2",
"md5" : "60fdd406e026330c2cfbec3e15e05414"
}
} ]
} ],
"continuationToken" : null
}
//Output when using res.json()
{
items: [
{
id: 'T0lDX0J1aWxkX0FydGlmYWN0czpmODk4YjM5MDNjYjk5YzU5NjgzNTk3ZWRjNWFmZjliYw',
repository: 'Build_Artifacts',
format: 'raw',
group: '/',
name: '05baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36.zip',
version: null,
assets: [Array]
},
{
id: 'T0lDX0J1aWxkX0FydGlmYWN0czpkMDY0ODA0YThlZDVhZDZlNjhmZGU5MWNmM2NiZTgzMw',
repository: 'Build_Artifacts',
format: 'raw',
group: '/',
name: '15baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36_2.zip',
version: null,
assets: [Array]
},
{
id: 'T0lDX0J1aWxkX0FydGlmYWN0czplMDE4OGVkMDcyOGZhNjhmNDExNzU2OGU1MjQ2NjZiYg',
repository: 'Build_Artifacts',
format: 'raw',
group: '/',
name: '25baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36_4.zip',
version: null,
assets: [Array]
},
{
id: 'T0lDX0J1aWxkX0FydGlmYWN0czo2NTRiYjdkMGE1OTIxMzg1OWZhMTVkMzNmYWU1ZmY3OA',
repository: 'Build_Artifacts',
format: 'raw',
group: '/',
name: '35baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36_3.zip',
version: null,
assets: [Array]
}
],
continuationToken: null
}
从上面可以看出 res.text() 提供经过验证/准确的 JSON,而 res.json() 不提供。如果没有准确的 JSON,解析会变得更加困难。
结束更新
我很接近得到这个吗?谁能指出我正确的方向或给我一个从我可以使用的提取请求创建缓冲对象的简单示例?感谢您提供任何和所有帮助。
【问题讨论】:
-
如果你需要 json 为什么不直接使用
const data = await res.json()而不是文本呢?这样它将成为对象,您可以使用它。 -
当我使用 res.json() 时,该对象不会作为合法的 JSON 返回。请参阅上面我在使用 res.json() 而不是 rest.text() 时添加输出的地方
-
从 json 的输出看不出有什么问题。如果您执行
JSON.stringify(await res.json()),您将看到正确的 json。当您嵌套了 json 对象时,console.log 将它们打印为像 [Array] 这样的对象 -
啊我明白你在说什么......让我用这个工具看看我是否可以正确解析它。我会尽快回复...谢谢!
-
所以我猜我的新手在这里显示的位置......当我将相同的 JSON 设置为变量时,即“const data = JSON”我可以使用以下符号解析它:控制台。 log(data.items[0].name) 并且我的输出显示“05baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36.zip”,这是我所期望的。但是,当我尝试使用函数返回输出进行相同的解析时,我得到“未定义”......我只是不明白为什么会这样......?我想我可以关闭这张票,然后用这个问题开始另一张票....
标签: javascript node.js fetch buffer response