使用默认 http API 在 Node JS 中向 Facebook Graph API 发出 HTTP POST 请求

Making an HTTP POST request to Facebook Graph API in Node JS with default http API

我需要通过图形 API 调用 post 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 请求的示例),所以我真的无法理解有什么问题这段代码。

您的代码不等同于 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 请求。