Ответ 1
Данные сообщения находятся в
this.Request.Body
Если у вас есть подходящий тип, вы можете десериализовать свои данные с помощью привязки модели:
var x = this.Bind<YourType>();
Я использую Corona SDK для отправки данных на мой сервер С#:
headers["Content-Type"] = "application/x-www-form-urlencoded"
headers["Accept-Language"] = "en-US"
local body = "color=red&size=small"
local params = {}
params.headers = headers
params.body = body
network.request( host .. "/UpdateHand", "POST", nwListener, params )
Я получаю сообщение на сервере:
Post["/UpdateHand"] = x =>
{
Console.WriteLine("Received ...");
return "Ok";
};
Но когда я проверяю данные (когда я накладываю на них точку останова), я не вижу, где мои данные локализованы (т.е. params.body или params.headers). Как я могу извлечь эту информацию?
Я должен правильно отправить его в соответствии с документацией на Corona: http://docs.coronalabs.com/daily/api/library/network/request.html
Данные сообщения находятся в
this.Request.Body
Если у вас есть подходящий тип, вы можете десериализовать свои данные с помощью привязки модели:
var x = this.Bind<YourType>();
Для этого существует расширение Нэнси. Вам нужно будет указать пространство имён.
using Nancy.Extensions;
var text = Context.Request.Body.AsString();
Мне нравится, насколько это лаконично, часть простейшего пути Nancy super-duper.
Но слово осторожности! Этот метод оставляет поток в конце, поэтому последующие вызовы возвращают пустую строку. Чтобы исправить это, всегда reset поток сразу после этого, например:
Request.Body.Seek(0, SeekOrigin.Begin);
Предполагается, что Nancy 2.0 исправит это так, что положением потока будет reset по умолчанию.
Это действительно отлично работает:
var body = this.Request.Body;
int length = (int) body.Length; // this is a dynamic variable
byte[] data = new byte[length];
body.Read(data, 0, length);
Console.WriteLine(System.Text.Encoding.Default.GetString(data));
Для Nancy 2.0.0 Request.Body
является Stream
а не RequestStream
, поэтому не имеет метода AsString
. Тем не менее, это похоже на работу:
using (var reqStream = RequestStream.FromStream(Request.Body))
{
var body = reqStream.AsString();
// ... do stuff with body
}
В идеале получение ваших данных может быть выполнено с помощью простого вызова Bind(). Тем не менее, я видел несогласованные результаты при использовании Bind в почтовом вызове, так что я прибегал к использованию схемы, описанной выше.
Я видел различные дискуссии о Нэнси Бинд(), работающие и не работающие... Я видел оба с Post, но не могу объяснить непоследовательность. Там, где я видел, что он работает правильно, я мог гарантировать, что тело запроса было обработано следующим образом:
var data = Encoding.ASCII.GetBytes (postData);
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = data.Length;
using (var stream = request.GetRequestStream ()) {
stream.Write (data, 0, data.Length);
}
Однако при отправке данных, которые должны были быть обработаны аналогично (хотя я не смог подтвердить) через инфраструктуру WSO2 (данные были сериализованы как словарь событий JSON, отправленный прокси-серверу службы), Bind не удалось, когда вышеописанный метод.