Каков эквивалентный способ установки параметров записи в .net? - PullRequest
6 голосов
/ 09 октября 2011

Я должен интегрироваться со сторонним 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.Тем не менее, я немного запутался в том, как установить данные параметра post.Я понял, что $ data выше - это не что иное, как словарь.Поэтому я создал эквивалентный словарь.Тем не менее, как мне установить параметры записи со значениями словаря?

В http://msdn.microsoft.com/en-us/library/debx8sh9.aspx, они сериализовали строку в байтовый массив, а затем установили в качестве параметра post в dataStream.Как мне сделать то же самое для словаря?

Или мой подход неверен?Есть ли лучший способ сделать это?

Ответы [ 4 ]

8 голосов
/ 09 октября 2011

Как правило, WebClient.UploadValues будет самым простым подходом здесь; полный пример см. В MSDN . Однако обратите внимание, что это распространяется только на CURLOPT_POSTFIELDS и CURLOPT_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);
}

note POST здесь подразумевается; если вам нужен другой метод http, используйте перегрузку:

var result = client.UploadValues(url, "PUT", data); // for example
3 голосов
/ 09 октября 2011

Если вы используете пост-данные, закодированные в URL, вы можете url-кодировать каждую пару ключ / значение вашего словаря, используя HttpServerUtility.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);
}
1 голос
/ 22 апреля 2016

На случай, если у вас есть для использования HttpWebRequest, приведенный ниже код преобразует Dictionary<String,String> с именем formVars в byte[] с именем toPost:

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

Playс рабочей копией на https://dotnetfiddle.net/IOzIE6

0 голосов
/ 09 октября 2011

Вы, вероятно, хотите использовать

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...