web-dev-qa-db-fra.com

Comment définir le contenu d'un HttpWebRequest en C #?

Un HttpWebRequest a les propriétés ContentLength et ContentType, mais comment définissez-vous réellement le contenu de la demande?

37
Curyous

Les éléments suivants devraient vous aider à démarrer

byte[]  buffer = ...request data as bytes
var webReq = (HttpWebRequest) WebRequest.Create("http://127.0.0.1/target");

webReq.Method = "REQUIRED METHOD";
webReq.ContentType = "REQUIRED CONTENT TYPE";
webReq.ContentLength = buffer.Length;

var reqStream = webReq.GetRequestStream();
reqStream.Write(buffer, 0, buffer.Length);
reqStream.Close();

var webResp = (HttpWebResponse) webReq.GetResponse();
41
Simon Fox

.NET 4.5 (ou .NET 4.0 en ajoutant le package Microsoft.Net.Http de NuGet) offre une grande flexibilité supplémentaire dans la définition du contenu de la demande. Voici un exemple:

private System.IO.Stream Upload(string actionUrl, string paramString, Stream paramFileStream, byte [] paramFileBytes)
{
    HttpContent stringContent = new StringContent(paramString);
    HttpContent fileStreamContent = new StreamContent(paramFileStream);
    HttpContent bytesContent = new ByteArrayContent(paramFileBytes);
    using (var client = new HttpClient())
    using (var formData = new MultipartFormDataContent())
    {
        formData.Add(stringContent, "param1", "param1");
        formData.Add(fileStreamContent, "file1", "file1");
        formData.Add(bytesContent, "file2", "file2");
        var response = client.PostAsync(actionUrl, formData).Result;
        if (!response.IsSuccessStatusCode)
        {
            return null;
        }
        return response.Content.ReadAsStreamAsync().Result;
    }
}
8
Joshcodes

Voici une option différente pour publier des informations sans jouer avec les octets et les flux. Personnellement, je trouve plus facile à suivre, à lire et à déboguer.

// Convert Object to JSON
var requestMessage = JsonConvert.SerializeObject(requestObject);
var content = new StringContent(requestMessage, Encoding.UTF8, "application/json");

// Create the Client
var client = new HttpClient();
client.DefaultRequestHeaders.Add(AuthKey, AuthValue);

// Post the JSON
var responseMessage = client.PostAsync(requestEndPoint, content).Result;
var stringResult = responseMessage.Content.ReadAsStringAsync().Result;

// Convert JSON back to the Object
var responseObject = JsonConvert.DeserializeObject<ResponseObject>(stringResult);
5
Justin

RequestStream de HttpWebRequest est où l'action est à - code approximatif ...

//build the request object
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(http://someapi.com/);
//write the input data (aka post) to a byte array
byte[] requestBytes = new ASCIIEncoding().GetBytes(inputData);
//get the request stream to write the post to
Stream requestStream = request.GetRequestStream();
//write the post to the request stream
requestStream.Write(requestBytes, 0, requestBytes.Length);

Si vous envoyez des caractères étendus, utilisez UTF8Encoding, assurez-vous de définir également le bon en-tête de type de contenu/jeu de caractères.

5
stephbu

HttpWebRequest.GetRequestStream() obtient le flux de requête. Après avoir défini les en-têtes, utilisez GetRequestStream() et écrivez le contenu dans le flux.

Cet article explique comment transmettre des fichiers en utilisant HttpWebRequest, qui devrait fournir un bon exemple de la façon d'envoyer du contenu.

Mais, fondamentalement, le format serait

 var stream = request.GetRequestStream();
 stream.Write( stuff );
 stream.Close();
 var response = request.GetResponse();
1
smartcaveman