【问题标题】:Making an HTTP POST request to Facebook Graph API in Node JS with default http API使用默认 http API 在 Node JS 中向 Facebook Graph API 发出 HTTP POST 请求
【发布时间】:2021-03-29 22:12:03
【问题描述】:

我需要通过调用图形 API 在 Facebook 页面上发布图片。 执行这个:

curl --request POST "https://graph.facebook.com/{pageId}/photos?url={imageUrl}&message={message}&access_token={pageAccessKey}"

效果很好,不痒。但是,我似乎无法在 Node 上完成这项工作。

const http = require("follow-redirects").http;
const querystring = require("querystring");

const pageId = "pageId";
const pageAccessKey = "pageAccessKey";

function facebookPostImage(imageUrl, message) {

    const data = querystring.stringify({

        access_token: pageAccessKey,
        url: imageUrl,
        message: message
    });

    const options = {

        method: "POST",
        hostname: "graph.facebook.com",
        path: `/${pageId}/photos`,
        headers: {
            "Content-Type": "application/x-www-form-urlencoded",
            "Content-Length": data.length,
        }
    };

    const request = http.request(options, response => {

        console.log(`statusCode: ${response.statusCode}`);

        response.on("data", chunk => {
    
            process.stdout.write(chunk);
        });    
    });

    request.on("error", error => {

        console.error(error);
    });

    request.write(data);

    request.end();
}

调用facebookPostImage 只会打印到控制台“statusCode: 500”。 不幸的是,我找不到任何通过这些 http API 调用 Facebook Graph API 的示例(甚至是通用 urlencoded http 请求的示例),所以我真的无法理解这段代码有什么问题。

【问题讨论】:

  • 为什么端点路径的末尾有问号?
  • @CBroe 这实际上是我出于绝望而添加的东西,只是为了尝试它是否可行。我要编辑代码的sn-p。
  • 您可能不会获得 500 状态代码,响应正文通常还包含人类可读的错误消息。所以去检查一下这个实例中包含的内容。
  • @CBroe 不是 response.on("data") 位吗?同样在错误上它应该打印出一些东西。奇怪的是,如果我在 JSON 中编码数据(我在某些时候错误地这样做了),它实际上给了我一个人类可读的错误(“需要用户访问令牌才能请求此资源。”),以及不同的状态代码。 (400)。
  • 惊讶于它甚至进入了那个代码块,我认为像 500 这样的 HTTP 错误应该触发 request.on("error" 部分?

标签: node.js http post facebook-graph-api


【解决方案1】:

您的代码不等同于 cURL 调用。 cURL 行执行这个 HTTP 请求:

POST /{pageId}/photos?url={imageUrl}&message={message}&access_token={pageAccessKey} HTTP/1.1
Host: graph.facebook.com
...some other headers...

--- END OF REQUEST ---

(注意没有身体!)

您的 Node.js 代码会这样做:

POST /{pageId}/photos HTTP/1.1
Host: graph.facebook.com
Content-Type: application/x-www-form-urlencoded
Content-Length: <some integer>

url={imageUrl}&message={message}&access_token={pageAccessKey}
--- END OF REQUEST ---

为了便于阅读,已添加--- END OF REQUEST ---

您实际上需要将参数作为查询字符串参数而不是作为表单主体传递。这似乎违反直觉,因为查询参数最常用于 GET 请求。

【讨论】:

  • 这实际上是我一开始所做的,但它没有奏效,所以我尝试按照我在发布的 sn-p 中显示的内容进行操作。实际上,如果我将 options.path 设置为 /${pageId}/photos?${data} 并删除标头和对 request.write() 的调用,它会继续返回 500 状态代码而没有错误消息。还有什么我忘记的吗?
  • @Gian 尝试使用 -v 标志运行 curl 并找出它发送的标头,在 Node 中复制它。
  • @Robet Kawecki 除了 user-agent: curl/7.74.0 和 accept: 以及它使用 HTTP/2 之外,它基本上看起来与您编写的相同
  • @Gian 尝试 HTTPS,而不是 http - API 可能不支持未加密的连接。
  • @Robet Kawecki 我简直不敢相信,它实际上是一个字符的工作。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2011-07-10
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
相关资源
最近更新 更多