【问题标题】:Why do I get "invalid_form_data" error when trying to post to Slack-API?为什么我在尝试发布到 Slack-API 时会收到“invalid_form_data”错误?
【发布时间】:2018-12-03 15:30:21
【问题描述】:

当我使用这个方法时:

public async Task<HttpResponseMessage> UploadFileAsync(MultipartFormDataContent requestContent)
{
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, UriMethod);
    request.Content = requestContent;
    var response = await _httpClient.SendAsync(request);

    return response;
}

我总能得到答案:

{"ok":false,"error":"invalid_form_data"}

所以我试图明确地告诉它“mediaType”,我尝试了“application/json”和其他的,但是我得到了同样的错误。下面是调用上层方法的完整 Main 方法:

    namespace TestArea
    {
        class MainArea
        {
            public static void Main( string[] args)
            {
                try
                {
                    Task.WaitAll(SendMessage());
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex);
                    Console.ReadKey();
                }
            }

 private static async Task SendMessage()
    {
        var client = new BpsHttpClient("https://slack.com/api/chat.postMessage");
        JsonObject JO = new JsonObject();
        JO.channel = "DCW21NBHD";
        JO.text = "This is so much fun :D !";
        var Json = JsonConvert.SerializeObject(JO, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

        var StringJson = new StringContent(Json, Encoding.UTF8, "application/json");

        var requestContent = new MultipartFormDataContent();
        requestContent.Add(StringJson);

        var Response = await client.UploadFileAsync(requestContent);

        string AnswerContent = await Response.Content.ReadAsStringAsync();

    }

当我使用这个方法时:

public async Task<HttpResponseMessage> SendMessageAsync(FormUrlEncodedContent content)
{
    var response = await _httpClient.PostAsync(UriMethod, content);

    return response;
}

所以基本上我在这里传递的是“FormUrlEncodedContent”而不是“MultipartFormDataContent”,然后我得到了我想要的响应并且可以使用它。但这对我来说没什么用,因为我必须使用“MultipartFormDataContent”才能发送带有我的请求的文件。

有人知道这里出了什么问题吗?为什么它不喜欢一种内容类型而是另一种?非常感谢您的提示和想法!

【问题讨论】:

  • 尚未使用 slack api,但我想知道您是否不应该将您创建的请求也设置为您的 UploadFileAsync 函数中的多部分
  • JsonConvertJsonObject 一起使用有什么意义?你知道什么是调试吗?你至少记录了var Json吗?
  • @FrancoPettigrosso - 没有粗话... @Selvin - 非常有帮助,谢谢。 @bradbury9 - 老实说,我不能说,我一直在这个代码的旧版本中使用这个方法就好了。但在旧版本中,我没有使用 Newtonsoft 的 NuGet 包序列化为 Json,而是使用 Dictionary&lt;string,string&gt; 序列化我的对象......还有其他想法吗?我的意思是这显然与我的 JSonObjects 相关......
  • @FabianHeld 在 MainArea 类的 main 方法中,你有 'ass'

标签: c# json slack-api


【解决方案1】:

您收到错误“invalid_form_data”,因为 API 方法 chat.postMessage 不支持使用 multipart/form-data 的请求。

从“接受的内容类型”下的documentation 可以看出,此方法仅接受:application/x-www-form-urlencodedapplication/json

请注意,您不能将文件上传到chat.postMessage

如果要上传文件,请使用API​​方法files.upload,同样支持multipart/form-data

有关如何上传带有评论的文件,另请参阅我的回答 here

【讨论】:

  • 嘿,Erik,我知道我可以使用哪些方法来做什么。所有人都应该知道 :) 我没有尝试上传任何内容,我只是想发布一条消息。我也必须能够使用其他方法。并且能够上传文件。但现在我只想发一条消息——你知道,从最简单的方法开始。正如我所写,我尝试了所有三种内容类型!这就是让我如此生气的原因......它没有任何区别。我总是遇到同样的错误。
  • 有趣的是,当我没有将序列化的JsonObject 放入“MultipartFormData”而是直接发送 JsonObject 时 - 这也应该有效,因为我只需要“Multipart”就可以添加稍后的文件 - 我收到错误“not_authed”。所以,这告诉我我的 JsonObject 不知何故被搞砸了。但是当我反序列化我的 JsonObject 时,它看起来非常好......
  • 看起来像这样:{ "as_user": true, "token": "xoxp-MyToken", "channel": "DCW21NBHD", "text": "This is so much fun :D !" }
  • 当我创建一个字典 并使用这些参数创建一个“FormUrlEncodedContent”对象时,它可以完美运行。但我只想使用我的 JsonObject 类,因为它应该可以工作,而且它会让事情变得更容易,因为我不必编写每一种可能的消息/请求。因此,如果有人知道我的 JsonObject 出了什么问题,我将非常感激听到它。 :)
  • 我刚刚意识到你为什么写我不应该在 chat.postMessage 中使用 MultipartFormData :D 我是个白痴。是的,我在这种方法上使用了 Multipart ......对不起。好的,那么真正的问题在于我的 JsonObject 以某种方式无法正确呈现令牌 - 就像我在上面写的那样。我在尝试时收到“not_authed”错误。
猜你喜欢
  • 2021-07-10
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多