在.net中设置post参数的等效方法是什么?

本文关键字:方法 是什么 参数 net 设置 post | 更新日期: 2023-09-27 18:10:52

我必须与第三方API集成。要使用该服务,我必须"POST"到带有某些参数的特定url。

该服务提供的示例代码是用php编写的,如下所示

$data = array('From' => '0999999', 'To' => '08888888'); 
$curl = curl_init();
curl_setopt($curl, CURLOPT_FAILONERROR, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);  <--- Ignore SSL warnings
curl_setopt($curl, CURLOPT_POST, true); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

我试图使用WebRequest类在。net中实现相同的功能。然而,我对如何设置后参数数据有点困惑。我认为上面的$data只是一个字典。所以我创建了一个等价的字典。但是,如何使用字典值设置post参数呢?

在http://msdn.microsoft.com/en-us/library/debx8sh9.aspx中,他们将字符串序列化为字节数组,然后将其设置为数据流中的post参数。如何对字典做同样的操作?

还是我的方法不正确?有更好的方法吗?

在.net中设置post参数的等效方法是什么?

一般来说,WebClient.UploadValues是这里最简单的方法;请参阅MSDN获取完整示例。但是,请注意,这仅涵盖CURLOPT_POSTFIELDSCURLOPT_POST。错误失败是自动和隐式的,响应已经作为byte[]包含。

using(var client = new WebClient()) {
    var data = new NameValueCollection();
    data.Add("From", "0999999");
    data.Add("To", "08888888");
    var result = client.UploadValues(url, data);
}

注意POST在这里是隐式的;如果您需要一个不同的HTTP方法,请使用overload:

var result = client.UploadValues(url, "PUT", data); // for example

如果您使用url编码的post数据,您可以使用HttpServerUtility对字典的每个键/值对进行url编码。UrlEncode Method (String)

// Build postData
StringBuilder post = new StringBuilder();
foreach(item in dictionary) {
  post.AppendFormat("&{0}={1}", item.key, HttpUtility.UrlEncode(item.value));
}
string postData = post.ToString();
// HTTP POST
Uri uri = new Uri(url);
request = (HttpWebRequest) WebRequest.Create(uri);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postData.Length;
using(Stream writeStream = request.GetRequestStream())
{
  UTF8Encoding encoding = new UTF8Encoding();
  byte[] bytes = encoding.GetBytes(postData);
  writeStream.Write(bytes, 0, bytes.Length);
}

万一您使用HttpWebRequest,下面的代码将名为formVarsDictionary<String,String>转换为名为toPostbyte[]:

byte[] toPost = System.Text.Encoding.UTF8.GetBytes(
    String.Join("&", formVars.Select(x =>
        HttpUtility.UrlEncode(x.Key) + "=" +
        HttpUtility.UrlEncode(x.Value)));
);

在https://dotnetfiddle.net/IOzIE6上玩一个工作副本

您可能想使用

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://url");
request.AllowWriteStreamBuffering = true;
request.Method = "POST";
string post = "From=0999999&To=08888888";
request.ContentLength = post.Length;
request.ContentType = "application/x-www-form-urlencoded";
StreamWriter writer = new StreamWriter(request.GetRequestStream());
writer.Write(post);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();