【发布时间】:2016-06-18 05:33:17
【问题描述】:
我正在开发 Telegram Bot 以使其与我们自己的应用程序同步... 我首先去了类似于 RestClient 扩展的 DHC chrome 扩展,并测试了我应该从 Telegram 服务器发送和接收数据的方式。其次,我想用 C# 来做,我已经实现了 getUpdate,我从 Telegram 接收传入的消息。现在我处于即将离开的阶段,并且我不断收到 400 的 StatusCode...
谁能说出为什么?怎么办?
可以在in here...找到机器人参考
public class SendMessage<TReplyMarkup>
{
/// <summary>
/// Integer Or String
/// </summary>
public string ChatId { get; set; }
public string Text { get; set; }
public string ParseMode { get; set; }
public bool? DisableWebPagePreview { get; set; }
public bool? DisableNotification { get; set; }
public long? ReplyToMessageId { get; set; }
public TReplyMarkup ReplyMarkup { get; set; }
}
public void Process(Update update)
{
SendMessage<Object> newMessage = new SendMessage<object>();
newMessage.Text = "Posting Message";
newMessage.ChatId = update.Message.Chat.Id.ToString();
HttpClient hc = new HttpClient();
HttpContent requestContent = new ObjectContent(typeof(SendMessage<object>), newMessage, new JsonMediaTypeFormatter
{
SerializerSettings = new JsonSerializerSettings
{
ContractResolver = new CustomPropertyNamesContractResolver
{
Case = IdentifierCase.UnderscoreSeparator
}
},
SupportedEncodings = { Encoding.UTF8 }
});
var responseMessage = hc.PostAsJsonAsync("https://api.telegram.org/bot" + AppSetting.Token + "/sendMessage", requestContent).Result;
//parse, see if is ok...
}
这里是我的对象状态:
我要发送的内容:
requestContent.ReadAsStringAsync()
Id = 77, Status = RanToCompletion, Method = "{null}", Result = "{\"chat_id\":\"55815152\",\"text\":\"Posting Message\",\"parse_mode\":null,\"disable_web_page_preview\":null,\"disable_notification\":null,\"reply_to_message_id\":null,\"reply_markup\":null}"
AsyncState: null
CancellationPending: false
CreationOptions: None
Exception: null
Id: 77
Result: "{\"chat_id\":\"55815152\",\"text\":\"Posting Message\",\"parse_mode\":null,\"disable_web_page_preview\":null,\"disable_notification\":null,\"reply_to_message_id\":null,\"reply_markup\":null}"
Status: RanToCompletion
我收到的内容:
responseMessage.Content.ReadAsStringAsync()
Id = 80, Status = RanToCompletion, Method = "{null}", Result = "{\"ok\":false,\"error_code\":400,\"description\":\"Bad Request: Message text is empty\"}"
AsyncState: null
CancellationPending: false
CreationOptions: None
Exception: null
Id: 80
Result: "{\"ok\":false,\"error_code\":400,\"description\":\"Bad Request: Message text is empty\"}"
Status: RanToCompletion
编辑
我发现问题在于可选字段,如果我将 null 或空传递给它们,电报 api 仍然会寻找它,并抛出错误,如果我根本不发送它们,它会起作用。现在如何告诉contractResolver,忽略空字段...
【问题讨论】:
标签: c# json serialization dotnet-httpclient telegram-bot