Подтвердить что ты не робот

Нэнси (С#): Как я могу получить свои данные?

Я использую 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

4b9b3361

Ответ 1

Данные сообщения находятся в

this.Request.Body

Если у вас есть подходящий тип, вы можете десериализовать свои данные с помощью привязки модели:

var x = this.Bind<YourType>();

Ответ 2

Для этого существует расширение Нэнси. Вам нужно будет указать пространство имён.

using Nancy.Extensions;
var text =  Context.Request.Body.AsString();

Мне нравится, насколько это лаконично, часть простейшего пути Nancy super-duper.

Но слово осторожности! Этот метод оставляет поток в конце, поэтому последующие вызовы возвращают пустую строку. Чтобы исправить это, всегда reset поток сразу после этого, например:

Request.Body.Seek(0, SeekOrigin.Begin);

Предполагается, что Nancy 2.0 исправит это так, что положением потока будет reset по умолчанию.

https://github.com/NancyFx/Nancy/pull/2158

Ответ 3

Это действительно отлично работает:

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

Ответ 4

Для Nancy 2.0.0 Request.Body является Stream а не RequestStream, поэтому не имеет метода AsString. Тем не менее, это похоже на работу:

using (var reqStream = RequestStream.FromStream(Request.Body))
{
    var body = reqStream.AsString();
    // ... do stuff with body
}

Ответ 5

В идеале получение ваших данных может быть выполнено с помощью простого вызова 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 не удалось, когда вышеописанный метод.