.NET: Самый простой способ отправить POST с данными и прочитать ответ
К моему удивлению, я не могу сделать ничего такого же, как это, из того, что я могу сказать, в .NET BCL:
byte[] response = Http.Post
(
url: "http://dork.com/service",
contentType: "application/x-www-form-urlencoded",
contentLength: 32,
content: "home=Cosby&favorite+flavor=flies"
);
Этот гипотетический код выше делает HTTP POST с данными и возвращает ответ от метода Post
для статического класса Http
.
Так как мы остались без чего-то такого легкого, что нового лучшего решения?
Как отправить HTTP POST с данными и получить ответный контент?
Ответы
Ответ 1
using (WebClient client = new WebClient())
{
byte[] response =
client.UploadValues("http://dork.com/service", new NameValueCollection()
{
{ "home", "Cosby" },
{ "favorite+flavor", "flies" }
});
string result = System.Text.Encoding.UTF8.GetString(response);
}
Вам понадобятся:
using System;
using System.Collections.Specialized;
using System.Net;
Если вы настаиваете на использовании статического метода/класса:
public static class Http
{
public static byte[] Post(string uri, NameValueCollection pairs)
{
byte[] response = null;
using (WebClient client = new WebClient())
{
response = client.UploadValues(uri, pairs);
}
return response;
}
}
Тогда просто:
var response = Http.Post("http://dork.com/service", new NameValueCollection() {
{ "home", "Cosby" },
{ "favorite+flavor", "flies" }
});
Ответ 2
Использование HttpClient: что касается проблем разработки приложений для Windows 8, я наткнулся на это.
var client = new HttpClient();
var pairs = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("pqpUserName", "admin"),
new KeyValuePair<string, string>("password", "[email protected]")
};
var content = new FormUrlEncodedContent(pairs);
var response = client.PostAsync("youruri", content).Result;
if (response.IsSuccessStatusCode)
{
}
Ответ 3
Используйте WebRequest. Из Скотт Гензельман:
public static string HttpPost(string URI, string Parameters)
{
System.Net.WebRequest req = System.Net.WebRequest.Create(URI);
req.Proxy = new System.Net.WebProxy(ProxyString, true);
//Add these, as we're doing a POST
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
//We need to count how many bytes we're sending.
//Post'ed Faked Forms should be name=value&
byte [] bytes = System.Text.Encoding.ASCII.GetBytes(Parameters);
req.ContentLength = bytes.Length;
System.IO.Stream os = req.GetRequestStream ();
os.Write (bytes, 0, bytes.Length); //Push it out there
os.Close ();
System.Net.WebResponse resp = req.GetResponse();
if (resp== null) return null;
System.IO.StreamReader sr =
new System.IO.StreamReader(resp.GetResponseStream());
return sr.ReadToEnd().Trim();
}
Ответ 4
private void PostForm()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://dork.com/service");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
string postData ="home=Cosby&favorite+flavor=flies";
byte[] bytes = Encoding.UTF8.GetBytes(postData);
request.ContentLength = bytes.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream);
var result = reader.ReadToEnd();
stream.Dispose();
reader.Dispose();
}
Ответ 5
Лично я считаю, что самый простой способ сделать сообщение http и получить ответ - использовать класс WebClient. Этот класс прекрасно абстрагирует детали. В документации MSDN есть даже полный код.
http://msdn.microsoft.com/en-us/library/system.net.webclient(VS.80).aspx
В вашем случае вы хотите использовать метод UploadData(). (Опять же, образец кода включен в документацию)
http://msdn.microsoft.com/en-us/library/tdbbwh0a(VS.80).aspx
UploadString(), вероятно, будет работать, и он абстрагирует его еще на один уровень.
http://msdn.microsoft.com/en-us/library/system.net.webclient.uploadstring(VS.80).aspx
Ответ 6
Я знаю, что это старый поток, но надеюсь, что это поможет кому-то.
public static void SetRequest(string mXml)
{
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.CreateHttp("http://dork.com/service");
webRequest.Method = "POST";
webRequest.Headers["SOURCE"] = "WinApp";
// Decide your encoding here
//webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.ContentType = "text/xml; charset=utf-8";
// You should setContentLength
byte[] content = System.Text.Encoding.UTF8.GetBytes(mXml);
webRequest.ContentLength = content.Length;
var reqStream = await webRequest.GetRequestStreamAsync();
reqStream.Write(content, 0, content.Length);
var res = await httpRequest(webRequest);
}
Ответ 7
Вы можете использовать что-то вроде этого псевдокода:
request = System.Net.HttpWebRequest.Create(your url)
request.Method = WebRequestMethods.Http.Post
writer = New System.IO.StreamWriter(request.GetRequestStream())
writer.Write("your data")
writer.Close()
response = request.GetResponse()
reader = New System.IO.StreamReader(response.GetResponseStream())
responseText = reader.ReadToEnd
Ответ 8
Это действительно отлично сработало для меня...
http://www.stickler.de/en/information/code-snippets/httpwebrequest-post-data.aspx