C # получение HTTP тела с помощью Nancy

c# nancy

2907 просмотра

4 ответа

371 Репутация автора

быстрый вопрос. Я использую Нэнси для преобразования вызовов REST в вызовы API в проекте, над которым я работаю. Я не могу заставить его работать.

У меня есть настроенная и работающая Нэнси, для запросов GET все в порядке. Однако, когда я делаю запрос POST, используя встроенный RestClient, например:

            restClient.Post("/test", "Param");

Я не могу понять, как получить «Param» после того, как был сделан звонок.

У меня есть настройка NancyModule как таковая:

public class TestNancyModule : NancyModule {
    public TestNancyModule() {
        Post["/test"] = p => {
            for(KeyValuePair<dynamic, dynamic> kvp in (DynamicDictionary)p)
                Console.WriteLine("{0}:{1}", kvp.Key, kvp.Value);
        }
    }
}

У меня есть настройка точки останова внутри NancyModule, которая срабатывает, когда я отправляю запрос на localhost / test, но я не могу понять, как извлечь «Param», как только я окажусь внутри Nancy модуль. В идеале я бы мог сделать что-то вроде

    string POSTParameters = p["Value"]
    //POSTParameters now equals "Param"

Какие-либо предложения?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Изменить: я оставляю оригинальный пост, но я уточню здесь. Я хотел спросить, как получить доступ к телу HTTP входящих запросов. Незнание протокола привело к некоторым ошибкам с моей стороны, использующим неправильную терминологию.

Автор: D. Stewart Источник Размещён: 18.07.2016 05:56

Ответы (4)


1 плюс

371 Репутация автора

Разобрался, он доступен под полем «Запрос».

Для кода я могу получить тело, сделав что-то вроде

            byte[] response = new byte[Request.Body.Length];
            Request.Body.Read(response, 0, (int)Request.Body.Length);

а также

            string POSTParameters = System.Text.Encoding.Default.GetString(response);

это именно то, что я искал. Если бы тело было более сложным, я бы не рекомендовал делать это, но я собираюсь передать только несколько слов для этого поста.

Автор: D. Stewart Размещён: 18.07.2016 06:10

3 плюса

14108 Репутация автора

Решение

Вы можете использовать .AsString()на теле, если вы тянете вNancy.Extensions

var thing = Request.Body.AsString();

Это путь Нэнси.

Автор: Phill Размещён: 19.07.2016 02:20

0 плюса

78 Репутация автора

Для параметров запроса вы можете использовать объект запроса Нэнси в модуле.

var queryParam =  this.Request.Query.ParamName;

Для реального тела сообщения вы можете использовать

this.Bind(); 

Который создаст динамику со свойствами, указанными в теле.

Автор: derek Размещён: 08.09.2016 01:41

3 плюса

1327 Репутация автора

В новых версиях NancyFx (1.4+) вы можете использовать это решение:

using Nancy.IO;
...
var yourString = RequestStream.FromStream(Request.Body).AsString();

пока

var yourString = Request.Body.AsString(); 

больше не поддерживается.

Автор: Artem G Размещён: 27.04.2017 09:49
Вопросы из категории :
32x32