【问题标题】:NodeJS - How to get response of URL?NodeJS - 如何获得 URL 的响应?
【发布时间】:2020-09-27 18:41:23
【问题描述】:

我有一个网址。当我在浏览器中访问该地址时,它会显示一个 json 文件。我需要在 NodeJs 中获取那个 json 文件。

我该怎么做?

编辑:这是我当前的代码:

const got = require('got');   

var url = "https://www.instagram.com/p/CFcyO54Hc7k/?__a=1";  

got(url).json().then(result => {     
    console.log(result); 
}).catch(err => {     
    console.log(err); 
});

这是我得到的结果:

Promise { <pending> }
Hint: hit control+c anytime to enter REPL.
RequestError: Unexpected token < in JSON at position 0 in "https://www.instagram.com/accounts/login/?next=/p/CFcyO54Hc7k/%3F__a%3D1"
    at Object.parseBody [as default] (/home/runner/VengefulUltimateSdk/node_modules/got/dist/source/as-promise/parse-body.js:22:15)
    at /home/runner/VengefulUltimateSdk/node_modules/got/dist/source/as-promise/index.js:157:40
    at JSON.parse (<anonymous>)
    at parseJson (/home/runner/VengefulUltimateSdk/node_modules/got/dist/source/index.js:118:35)
    at Object.parseBody [as default] (/home/runner/VengefulUltimateSdk/node_modules/got/dist/source/as-promise/parse-body.js:11:48)
    at /home/runner/VengefulUltimateSdk/node_modules/got/dist/source/as-promise/index.js:157:40
    at processTicksAndRejections (internal/process/task_queues.js:97:5) {
  name: 'ParseError',
  code: undefined,
  timings: {
    start: 1601274389096,
    socket: 1601274389096,
    lookup: 1601274389106,
    connect: 1601274389117,
    secureConnect: 1601274389128,
    upload: 1601274389128,
    response: 1601274389467,
    end: 1601274389511,
    error: undefined,
    abort: undefined,
    phases: {
      wait: 0,
      dns: 10,
      tcp: 11,
      tls: 11,
      request: 0,
      firstByte: 339,
      download: 44,
      total: 415
    }
  }
}

我的节点版本是12.16.1

【问题讨论】:

  • @tomerpacific 不,它对我不起作用。我不能得到 json 。
  • @UzaySan 你是什么意思它不起作用?那个帖子有很多答案。你试过几个?我不认为很多,因为您在分享该链接后仅 3 分钟后就回复了。
  • @Sнаđошƒаӽ 是的一堆答案,但他们都建议使用 http 库。当我使用该方法时,我会得到响应标头。不是实际的 json。
  • 你想把这个写入文件吗?

标签: javascript node.js get


【解决方案1】:

如果您想将其作为 json 获取,您可以使用 fetch api (https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API),然后在 Promise 中您可以将 json 作为 js 代码中的对象读取。

fetch('http://server/file.json').then(resp=>resp.json()).then(data=>{do something with data});

【讨论】:

  • fetch() 在浏览器中工作。 OP 要求在 node.js 中提供解决方案。
【解决方案2】:

你可以在 NodeJS 中使用 axios。

axios.get('https://someapiendpoint.domain.com/v1/api')
  .then((response) => {
    console.log(response.data);
  });

【讨论】:

  • 我试过 axios。但得到相同的结果。 https://www.instagram.com/p/CFcyO54Hc7k/?__a=1 不返回 json。但在浏览器中它显示一个 json。
  • 您无法直接访问 Instagram API,因为 Instagram 旧 API 权限已于 2020 年 6 月 29 日禁用,以支持新的 Instagram 图 API。你可以试试包装npmjs.com/package/instagram-graph-sdk
【解决方案3】:

您可以自己解析 JSON,也可以获取一个用于发出 Http 请求的库,该库会自动为您解析 JSON。 here 有很多库可供选择。我最喜欢的是got(),它可以让你解析JSON,并添加一个简单的.json(),这样你得到的解析值就是一个Javascript对象。

const got = require('got');

got("https://www.instagram.com/p/CFcyO54Hc7k/?__a=1").json().then(result => {
    console.log(result);
}).catch(err => {
    console.log(err);
});

当我使用您的 instagram URL 运行上述代码时,我得到了这个 Javascript 对象:

{
  graphql: {
    shortcode_media: {
      __typename: 'GraphSidecar',
      id: '2404017227651993316',
      shortcode: 'CFcyO54Hc7k',
      dimensions: [Object],
      gating_info: null,
      fact_check_overall_rating: null,
      fact_check_information: null,
      sensitivity_friction_info: null,
      media_overlay_info: null,
      media_preview: null,
      display_url: 'https://scontent-sjc3-1.cdninstagram.com/v/t51.2885-15/e35/119980944_890957481429986_8757958615208227911_n.jpg?_nc_ht=scontent-sjc3-1.cdninstagram.com&_nc_cat=102&_nc_ohc=w7zBW_FdRNgAX9BYknl&_nc_tp=18&oh=11424efc118b55180e4d3302d75181ca&oe=5F99EB23',
      display_resources: [Array],
      is_video: false,
      tracking_token: 'eyJ2ZXJzaW9uIjo1LCJwYXlsb2FkIjp7ImlzX2FuYWx5dGljc190cmFja2VkIjp0cnVlLCJ1dWlkIjoiZGIyMzdkMzgzYWVhNDY5YmI0ZWVkZWI4YzlhZDY0YWUyNDA0MDE3MjI3NjUxOTkzMzE2In0sInNpZ25hdHVyZSI6IiJ9',
      edge_media_to_tagged_user: [Object],
      edge_media_to_caption: [Object],
      caption_is_edited: false,
      has_ranked_comments: false,
      edge_media_to_parent_comment: [Object],
      edge_media_to_hoisted_comment: [Object],
      edge_media_preview_comment: [Object],
      comments_disabled: false,
      commenting_disabled_for_viewer: false,
      taken_at_timestamp: 1600801207,
      edge_media_preview_like: [Object],
      edge_media_to_sponsor_user: [Object],
      location: null,
      viewer_has_liked: false,
      viewer_has_saved: false,
      viewer_has_saved_to_collection: false,
      viewer_in_photo_of_you: false,
      viewer_can_reshare: true,
      owner: [Object],
      is_ad: false,
      edge_web_media_to_related_media: [Object],
      edge_sidecar_to_children: [Object],
      edge_related_profiles: [Object]
    }
  }
}

如果您想修改现有代码,那么您可能需要使用JSON.parse()。您必须将现有代码添加到您的问题中,以便我们提供帮助。

【讨论】:

  • 我不想写文件。我需要在其中提取一些对象并将其保存到数据库中。我想我需要解释一下。这是我的网址:https://www.instagram.com/p/CFcyO54Hc7k/?__a=1 我想从此网址获取 json。当我在浏览器中访问此 url 时,它会显示 json 文件。但是在 node js 中,它只是使用 javascript 方法返回 html。我试过请求库。但我想我需要添加会话令牌头。
  • 我还提到,当我将请求库与reddit.com/popular.json 等其他网址一起使用时,它会返回 json。所以我想我的问题出在 Instagram 上。但我不知道如何解决它
  • @UzaySan - 我的错误。我在我现在添加的代码中留下了.json()。当我插入它时,你的 instagram URL 给了我一个很好的 Javascript 对象。将来,请在您的问题中包含特定 URL 等内容,以便人们根据您的实际情况测试他们的答案。
  • 我尝试了最新的代码。我得到这个错误。 RequestError: Unexpected token &lt; in JSON at position 0 in "https://www.instagram.com/accounts/login/?next=/p/CFcyO54Hc7k/%3F__a%3D1" 我想我需要添加一个会话令牌。我怎样才能添加这个?或者如何解决这个问题?编辑:我看到你添加了一个完美的 json 文件。我无法理解。我正在使用 repl.it 在线节点编辑器。
  • @UzaySan - 当我将你的 instagram URL 插入上面的代码时,我得到了答案中现在显示的 Javascript 对象。这不是你想要的吗?请注意,%3F 和 %3D 不应出现在您的 URL 中。这表明某些东西正在编码?和 = 并且不应该这样做。您需要在 URL 中使用真实字符。
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 2019-05-23
  • 2017-12-24
  • 2014-12-21
  • 2015-03-29
  • 2011-03-03
相关资源
最近更新 更多