Fabian Held
Fabian Held

Reputation: 403

Why do I get "invalid_form_data" error when trying to post to Slack-API?

When I use this method:

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;
}

I allways get the answer:

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

so I tried to explicitly tell it the 'mediaType', I tried "application/json" and others, but with all of them I get the same error. Here is the full Main-method that calls the upper method:

    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();

    }

When I use this method:

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

    return response;
}

so basically I am passing "FormUrlEncodedContent" instead of "MultipartFormDataContent" in this, and then I get the response I want and can work wiht it. BUT this is of little use to me since I have to use "MultipartFormDataContent" to be able to send files with my requests.

Anyone have an idea what is failing here? Why does it not like the one content-type but the other one? I'd be gratefull for tipps and ideas!

Upvotes: 3

Views: 6122

Answers (1)

Erik Kalkoken
Erik Kalkoken

Reputation: 32852

You get the error "invalid_form_data", because the API method chat.postMessage does not support requests with multipart/form-data.

As you can see from the documentation under "Accepted content types" this method only accepts: application/x-www-form-urlencoded, application/json

Note that you can not upload files to chat.postMessage.

If you want to upload files, please use the API method files.upload, which also supports multipart/form-data.

See also my answer here for how to upload files with a comment.

Upvotes: 2

Related Questions