Почему я получаю ошибку not_authed от Slack при отправке пост-запроса из c #? - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь сериализовать объект в Json и затем отправить его в Slack.Я сделал это успешно без сериализации, но вместо этого, используя «Словарь» и «FormUrlEncodedContent», а затем отправить его.Но теперь, чтобы сделать вещи проще и гибче, я просто хотел создать один JSon-класс, который я мог бы сериализовать и затем использовать для каждого запроса, который я хочу отправить.

Вот мой код:

Мой JsonObject:

    public class JsonObject
    {
        private string _token = "xoxp-MyToken";
        [JsonProperty("token")]
        public string token { get { return _token; } }
        [JsonProperty("channel")]
        public string channel { get; set; }
        [JsonProperty("as_user")]
        public bool as_user = true;      
        [JsonProperty("username")]
        public string username { get;set; } 
        [JsonProperty("text")]
        public string text { get; set; }
}

Мой клиент:

public class BpsHttpClient
{
    private readonly HttpClient _httpClient = new HttpClient { };
    public Uri UriMethod { get; set; }

    public BpsHttpClient(string webhookUrl)
    {
        UriMethod = new Uri(webhookUrl);
    }        

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

        return response;
    }
}

Основной:

 class MainArea
    {
        public static void Main( string[] args)
        {
            try
            {
                Task.WaitAll(SendMessage());
            }
            catch(Exception ass)
            {
                Console.WriteLine(ass);
                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 DeSon = JsonConvert.DeserializeObject(Json);

            Console.WriteLine(DeSon); //this is for me to see if my JsonObject looks correct - it does ;)
            Console.ReadKey();

            var Response = await client.UploadFileAsync(StringJson);

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

            Console.WriteLine(AnswerContent);
            Console.ReadKey();
        }

}

Когда я запускаюкод, который я всегда получаю ответ:

Вывод:
{"ok":false,"error":"not_authed"}

хотя я думаю, что мой JsonObject выглядит правильно - в нем есть токен ..У кого-нибудь есть идеи, почему?

1 Ответ

0 голосов
/ 04 декабря 2018

Итак, я понял - я НЕ ДОЛЖЕН помещать свой токен в JsonObject, который я хочу отправить.

Решение в этом случае (с использованием httpclient) состоит в том, что необходимо добавить заголовок для авторизации клиенту, например, так:

httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "lé token");

, и тогда это работает.

...