การตั้งค่าข้อมูลเนื้อหาของ WebRequest


122

ฉันกำลังสร้างคำขอทางเว็บใน ASP.NET และฉันต้องการเพิ่มข้อมูลจำนวนมากในเนื้อหา ฉันจะทำอย่างไร?

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

คำตอบ:


108

กับ HttpWebRequest.GetRequestStream

ตัวอย่างโค้ดจาก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);

จากรหัสของฉันเอง:

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;
}

สวัสดีคุณ Torbjorn ฉันกำลังใช้คำขอเพื่อที่ฉันจะได้รับ 'request.GetResponse ();' ในตัวอย่างข้างต้นมันจะทำงานอย่างไร?
William Calleja

เมื่อคุณเรียก GetRequestStream () มันจะทำการโทรไปที่เซิร์ฟเวอร์ คุณจะต้องเพิ่มสิ่งนั้นต่อท้ายตัวอย่างด้านบน
Torbjörn Hansson

1
มีวิธีดูข้อความแบบเต็มภายในออบเจ็กต์คำขอเพื่อวัตถุประสงค์ในการดีบักหรือไม่? ฉันลองทำให้เป็นอนุกรมและลองใช้ StreamReader แต่ไม่ว่าฉันจะทำอย่างไรฉันก็ไม่เห็นข้อมูลที่ฉันเพิ่งเขียนไปยังคำขอ
James

พัดลมซ-tastic!

@ เจมส์คุณควรจะสามารถใช้ fiddler หรือ Wirehark เพื่อดูคำขอฉบับเต็มพร้อมกับร่างกายได้
RayLoveless

49

ปรับปรุง

ดูคำตอบอื่น ๆ ของฉัน


เป็นต้นฉบับ

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();

คุณขาดอะไรไปหรือเปล่า? เช่น httpWReq.Content = newStream; คุณไม่ได้ใช้ออบเจ็กต์ newStream กับ webRequest ของคุณ
Yogurtu

4
หากต้องการตอบคำถามของ @ Yogurtu เพื่อความสมบูรณ์Streamวัตถุที่ newStreamชี้ให้เขียนโดยตรงไปยังเนื้อหาของคำขอ HttpWReq.GetRequestStream()มันมีการเข้าถึงโดยการเรียกร้องให้ ไม่จำเป็นต้องตั้งค่าสิ่งอื่นใดตามคำขอ
MojoFilter

0

คำตอบในหัวข้อนี้ยอดเยี่ยมมาก อย่างไรก็ตามฉันต้องการเสนออีกอันหนึ่ง เป็นไปได้มากว่าคุณได้รับ api และต้องการสิ่งนั้นในโครงการ c # ของคุณ เมื่อใช้ Postman คุณสามารถตั้งค่าและทดสอบการโทร api ได้ที่นั่นและเมื่อทำงานอย่างถูกต้องคุณสามารถคลิก 'Code' จากนั้นคำขอที่คุณกำลังดำเนินการจะถูกเขียนลงใน ac # snippet แบบนี้:

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", "development+XXXXXXXX-admin@XXXXXXX.XXXX");
request.AddParameter("password", "XXXXXXXXXXXXX");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

โค้ดด้านบนขึ้นอยู่กับ RestSharp แพ็กเกจ nuget ซึ่งคุณสามารถติดตั้งได้อย่างง่ายดาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.