我有这种情况。 我们正在使用一些方法进行登录,但是该方法在一些更高的抽象级别上,因此它只有像username和password这样的参数,并且使用这个参数进行一些Name值集合,而不是传递给某个请求构建器。注入此请求构建器以便我可以更改它的实现。现在我们正在使用POST请求,但将来我们可能会使用XML或JSON,因此只需切换注入接口的实现。
问题是我无法使任何库使用System.Net.HttpWebRequest从这个名称值集合中删除。 我需要这样的原型方法:
WebRequest / HttpWebRequest CreateRequest(Uri / string, nameValueCollection);
或者如果没有类似的东西,那么完成所有工作(发送请求,接收响应和解析它们)的库也会很好。但它需要是异步的。
提前致谢。
答案 0 :(得分:11)
我不是100%确定你想要什么,但是为了创建一个将从NameValueCollection发布一些数据的Web请求,你可以使用这样的东西:
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
的方式。