Отправка NameValueCollection в http запрос C # - PullRequest
5 голосов
/ 11 августа 2011

У меня такая ситуация. Мы используем какой-то метод для входа в систему, но этот метод находится на некотором более высоком уровне абстракции, поэтому он имеет только такие параметры, как имя пользователя и пароль, которые создают некоторую коллекцию значений имени с этими параметрами, а затем передаются в какой-либо сборщик запросов. Этот конструктор запросов внедряется, чтобы я мог изменить его реализацию. Сейчас мы используем запрос POST, но в будущем мы можем использовать XML или JSON, поэтому просто переключим реализацию внедренного интерфейса.

Проблема в том, что я не могу оштрафовать любую библиотеку, которая сделает меня System.Net.HttpWebRequest из этой коллекции значений имен. Мне нужен метод с прототипом, как это:

WebRequest / HttpWebRequest  CreateRequest(Uri / string, nameValueCollection);

Или, если чего-то подобного нет, библиотека, которая выполняет всю работу (отправка запросов, получение ответов и их анализ), тоже будет хорошей. Но он должен быть асинхронным.

Заранее спасибо.

1 Ответ

12 голосов
/ 11 августа 2011

Я не на 100% уверен, что вы хотите, но чтобы создать веб-запрос, который будет публиковать некоторые данные из коллекции NameValueCollection, вы можете использовать что-то вроде этого:

HttpWebRequest GetRequest(String url, NameValueCollection nameValueCollection)
{
    // Here we convert the nameValueCollection to POST data.
    // This will only work if nameValueCollection contains some items.
    var parameters = new StringBuilder();

    foreach (string key in nameValueCollection.Keys)
    {
        parameters.AppendFormat("{0}={1}&", 
            HttpUtility.UrlEncode(key), 
            HttpUtility.UrlEncode(nameValueCollection[key]));
    }

    parameters.Length -= 1;

    // Here we create the request and write the POST data to it.
    var request = (HttpWebRequest)HttpWebRequest.Create(url);
    request.Method = "POST";

    using (var writer = new StreamWriter(request.GetRequestStream()))
    {
        writer.Write(parameters.ToString());
    }

    return request;
}

Однако данные, которые вы публикуете, будут зависеть от формата, который вы принимаете. В этом примере используется формат строки запроса, но если вы переключаетесь на JSON или что-то еще, вам просто нужно изменить способ обработки NameValueCollection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...