Đặt dữ liệu nội dung của WebRequest


122

Tôi đang tạo một yêu cầu web trong ASP.NET và tôi cần thêm một loạt dữ liệu vào phần nội dung. Làm thế nào để làm điều đó?

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

Câu trả lời:


107

Với HttpWebRequest.GetRequestStream

Ví dụ về mã từ 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);

Từ một trong những mã của riêng tôi:

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

Xin chào Torbjorn, tôi đang sử dụng yêu cầu để tôi có thể nhận được 'request.GetResponse ();', trong ví dụ trên, điều đó sẽ hoạt động như thế nào?
William Calleja

Khi bạn gọi GetRequestStream (), nó thực hiện cuộc gọi đến máy chủ. Vì vậy, bạn sẽ phải thêm điều đó vào cuối ví dụ trên.
Torbjörn Hansson

1
Có cách nào để xem toàn bộ văn bản bên trong một đối tượng yêu cầu cho mục đích gỡ lỗi không? Tôi đã thử tuần tự hóa nó và thử sử dụng StreamReader, nhưng cho dù tôi có làm gì đi nữa thì tôi cũng không thể thấy dữ liệu mà tôi vừa ghi vào yêu cầu.
James

Fan-freaking-tastic!

@James, Bạn có thể sử dụng fiddler hoặc wirehark để xem toàn bộ yêu cầu với nội dung của nó.
RayLoveless

49

Cập nhật

Xem câu trả lời SO khác của tôi.


Nguyên

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

Bạn đang thiếu một cái gì đó? Giống như một httpWReq.Content = newStream; bạn không sử dụng đối tượng newStream với webRequest của mình.
Yogurtu

4
Để trả lời câu hỏi của @ Yogurtu về tính hoàn chỉnh, Streamđối tượng newStreamtrỏ đến ghi trực tiếp vào phần nội dung của yêu cầu. Nó được truy cập bằng cuộc gọi tới HttpWReq.GetRequestStream(). Không cần đặt bất cứ thứ gì khác theo yêu cầu.
MojoFilter

0

Các câu trả lời trong chủ đề này đều tuyệt vời. Tuy nhiên tôi muốn đề xuất một cái khác. Nhiều khả năng bạn đã được cấp một api và muốn nó vào dự án c # của bạn. Sử dụng Postman, bạn có thể thiết lập và kiểm tra lệnh gọi api ở đó và khi nó chạy đúng cách, bạn chỉ cần nhấp vào 'Mã' và yêu cầu mà bạn đang thực hiện, được ghi vào ac # snippet. như thế này:

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

Đoạn mã trên phụ thuộc vào gói nuget RestSharp mà bạn có thể dễ dàng cài đặt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.