Я пытаюсь сериализовать объект в Json, а затем отправить его в Slack. Я успешно сделал это без сериализации, но вместо этого использовал «Dictionary» и «FormUrlEncodedContent», а затем отправил его. Но теперь, с целью упростить и повысить гибкость, я просто хотел создать один JSon-класс, который я мог бы сериализовать, а затем использовать для каждого запроса, который я хочу отправить.
Вот мой код:
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();
}
}
Когда я запускаю код, я всегда получаю ответ:
Output:
{"ok":false,"error":"not_authed"}
хотя я думаю, что мой JsonObject выглядит правильно - там есть токен ... У кого-нибудь есть идея, почему?





Итак, я понял это - я НЕ ДОЛЖЕН помещать свой токен в JsonObject, который хочу отправить.
Решение в этом случае (с использованием httpclient) состоит в том, что нужно добавить заголовок для авторизации клиенту, например:
httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "lé token");
и тогда это работает.
На самом деле не так очевидно, что Slack больше не принимает ваш токен в качестве обычного параметра при использовании JSON. На самом деле это проблема, о которой я видел много людей, пишущих на SO. ;-) Кроме того, пожалуйста, никаких ругательств. Я удалил это.