Menyetel data tubuh WebRequest

122

Saya membuat permintaan web di ASP.NET dan saya perlu menambahkan banyak data ke tubuh. Bagaimana aku melakukan itu?

var request = HttpWebRequest.Create(targetURL);
request.Method = "PUT";
response = (HttpWebResponse)request.GetResponse();
William Calleja
sumber

Jawaban:

107

Dengan HttpWebRequest.GetRequestStream

Contoh kode dari http://msdn.microsoft.com/en-us/library/d4cek6cc.aspx

string postData = "firstone=" + inputData;
ASCIIEncoding encoding = new ASCIIEncoding ();
byte[] byte1 = encoding.GetBytes (postData);

// Set the content type of the data being posted.
myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";

// Set the content length of the string being posted.
myHttpWebRequest.ContentLength = byte1.Length;

Stream newStream = myHttpWebRequest.GetRequestStream ();

newStream.Write (byte1, 0, byte1.Length);

Dari salah satu kode saya sendiri:

var request = (HttpWebRequest)WebRequest.Create(uri);
request.Credentials = this.credentials;
request.Method = method;
request.ContentType = "application/atom+xml;type=entry";
using (Stream requestStream = request.GetRequestStream())
using (var xmlWriter = XmlWriter.Create(requestStream, new XmlWriterSettings() { Indent = true, NewLineHandling = NewLineHandling.Entitize, }))
{
    cmisAtomEntry.WriteXml(xmlWriter);
}

try 
{    
    return (HttpWebResponse)request.GetResponse();  
}
catch (WebException wex)
{
    var httpResponse = wex.Response as HttpWebResponse;
    if (httpResponse != null)
    {
        throw new ApplicationException(string.Format(
            "Remote server call {0} {1} resulted in a http error {2} {3}.",
            method,
            uri,
            httpResponse.StatusCode,
            httpResponse.StatusDescription), wex);
    }
    else
    {
        throw new ApplicationException(string.Format(
            "Remote server call {0} {1} resulted in an error.",
            method,
            uri), wex);
    }
}
catch (Exception)
{
    throw;
}
Torbjörn Hansson
sumber
Hai Torbjorn, saya menggunakan permintaan tersebut sehingga saya bisa mendapatkan 'request.GetResponse ();', dalam contoh di atas bagaimana cara kerjanya?
William Calleja
Ketika Anda memanggil GetRequestStream () itu membuat panggilan ke server. Jadi, Anda harus menambahkannya di akhir contoh di atas.
Torbjörn Hansson
1
Apakah ada cara untuk melihat teks lengkap di dalam objek request untuk tujuan debugging? Saya mencoba membuat serial dan mencoba menggunakan StreamReader, tetapi apa pun yang saya lakukan, saya tidak dapat melihat data yang baru saja saya tulis untuk permintaan tersebut.
Yakobus
Fan-freaking-tastic!
@ James, Anda harus dapat menggunakan fiddler atau wireshark untuk melihat permintaan lengkap dengan tubuhnya.
RayLoveless
49

Memperbarui

Lihat jawaban SO saya yang lain.


Asli

var request = (HttpWebRequest)WebRequest.Create("https://example.com/endpoint");

string stringData = ""; // place body here
var data = Encoding.Default.GetBytes(stringData); // note: choose appropriate encoding

request.Method = "PUT";
request.ContentType = ""; // place MIME type here
request.ContentLength = data.Length;

var newStream = request.GetRequestStream(); // get a ref to the request body so it can be modified
newStream.Write(data, 0, data.Length);
newStream.Close();
Evan Mulawski
sumber
Apakah Anda melewatkan sesuatu? Seperti httpWReq.Content = newStream; Anda tidak menggunakan objek newStream dengan webRequest Anda.
Yogurtu
4
Untuk menjawab pertanyaan @ Yogurtu tentang kelengkapan, Streamobjek yang newStreammengarah ke menulis langsung ke isi permintaan. Itu diakses oleh panggilan ke HttpWReq.GetRequestStream(). Tidak perlu mengatur apa pun berdasarkan permintaan.
MojoFilter
0

Jawaban dalam topik ini semuanya bagus. Namun saya ingin mengusulkan yang lain. Kemungkinan besar Anda telah diberi api dan menginginkannya ke dalam proyek c # Anda. Menggunakan Postman, Anda dapat mengatur dan menguji panggilan api di sana dan setelah itu berjalan dengan benar, Anda cukup mengklik 'Kode' dan permintaan yang telah Anda kerjakan, ditulis ke ac # snippet. seperti ini:

var client = new RestClient("https://api.XXXXX.nl/oauth/token");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Basic   N2I1YTM4************************************jI0YzJhNDg=");
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddParameter("grant_type", "password");
request.AddParameter("username", "[email protected]");
request.AddParameter("password", "XXXXXXXXXXXXX");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

Kode di atas bergantung pada paket nuget RestSharp, yang dapat Anda instal dengan mudah.

real_yggdrasil
sumber