如何通过邮递员中的原始文本或来自 Visual Studio 的 HTTP 请求正确地将文件上传到 Meta Whatsapp API?

问题描述 投票:0回答:1

我开始使用 WhatsApp API(面向开发人员的元数据),并且我已经能够使用邮递员以及我创建的 Visual Studio 项目 (C#) 通过链接成功发送文本,甚至图像或文件。问题是,每当我尝试上传本地文件时,我总是收到错误!每当我使用邮递员“表单数据”模板时,我都没有问题,文件上传得很好,并且我得到了文件的 ID,但是每当我尝试使用原始 JSON 代码执行此操作时(就像我一直在做的那样)消息和链接文件)我不断收到此错误“(#100)参数 messages_product 是必需的。”尽管已经在代码中指定了,甚至在我检查了所有标题都与工作示例中相同之后。我还在邮递员中导入了 cURL 命令,它似乎工作得很好,但同样,邮递员只将“表单数据”显示为正文,我无法手动放置文件位置,只能通过表单,所以我不知道语法是什么,也不知道它是如何在代码中实际引入的。

这是邮递员中提供的 raw/JSON 示例,我刚刚更改了文件位置(我怀疑错误就在这里,可能是语法或其他原因)

{    
    "file": "C:/dune2.jpg;type=image/jpeg",
    "messaging_product": "whatsapp"
}

我在 C# 中也做了同样的事情

HttpClient client = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "https://graph.facebook.com/v15.0/*****/media");
request.Headers.Add("Authorization", "Bearer ******");

MultipartFormDataContent content = new MultipartFormDataContent();
content.Add(new ByteArrayContent(File.ReadAllBytes("dune2.jpg")), "file", Path.GetFileName("C:/dune2.jpg"));
content.Add(new StringContent("image/jpeg"), "type");
content.Add(new StringContent("whatsapp"), "messaging_product");
request.Content = content;
request.Content.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data");

HttpResponseMessage response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
MessageBox.Show(responseBody);

尽管已经提供了,但它显示了相同的错误“(#100) 参数 messages_product 是必需的”。 (路径文件和文件夹是正确的,因为我直接检查了它们,也进行了其他测试)

这是导入到postman后效果很好的curl命令:

curl -X POST 'https://graph.facebook.com/v15.0/****/media' \
-H 'Authorization: Bearer *****' \
-H 'Content-type: application/json' \
-F 'file=@"****.jpg"' \
-F 'type="image/jpeg"' \
-F 'messaging_product="whatsapp"'

但是文件字段已转换为表单字段,因此必须像这样输入:

form-data

c# curl facebook-graph-api postman whatsapp-cloud-api
1个回答
0
投票

更新:我让它工作了,似乎在使用“ByteArrayContent”时,未指定内容类型,所以我使用“StreamContent”代替,如下:

MultipartFormDataContent content = new MultipartFormDataContent();
var imageContent = new StreamContent(File.OpenRead("D:\\Windows Libraries\\Desktop\\dune2.jpg"));
imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse(System.Net.Mime.MediaTypeNames.Image.Jpeg);
content.Add(imageContent, "file", Path.GetFileName("D:\\Windows Libraries\\Desktop\\dune2.jpg"));

Mime 类型是必要的。

© www.soinside.com 2019 - 2024. All rights reserved.