Voici comment j'appelle un service avec .NET:
var requestedURL = "https://accounts.google.com/o/oauth2/token?code=" + code + "&client_id=" + client_id + "&client_secret=" + client_secret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code";
HttpWebRequest authRequest = (HttpWebRequest)WebRequest.Create(requestedURL);
authRequest.ContentType = "application/x-www-form-urlencoded";
authRequest.Method = "POST";
WebResponse authResponseTwitter = authRequest.GetResponse();
mais quand cette méthode est invoquée, je reçois:
Détails des exceptions: System.Net.WebException: le serveur distant a renvoyé une erreur: (411) Length Required.
que devrais-je faire?
Lorsque vous utilisez HttpWebRequest et la méthode POST, vous devez définir un contenu (ou un corps si vous préférez) via RequestStream. Mais, selon votre code, utiliser authRequest.Method = "GET" devrait suffire.
Si vous vous interrogez sur le format POST, voici ce que vous devez faire:
ASCIIEncoding encoder = new ASCIIEncoding();
byte[] data = encoder.GetBytes(serializedObject); // a json object, or xml, whatever...
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = data.Length;
request.Expect = "application/json";
request.GetRequestStream().Write(data, 0, data.Length);
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
vous devez ajouter Content-Length: 0
dans l'en-tête de votre demande.
un exemple très descriptif de la façon de tester est donné ici
Lorsque vous créez une POST
HttpWebRequest, vous devez spécifier la longueur des données que vous envoyez, comme suit:
string data = "something you need to send"
byte[] postBytes = Encoding.ASCII.GetBytes(data);
request.ContentLength = postBytes.Length;
si vous n'envoyez aucune donnée, définissez-la simplement sur 0, cela signifie qu'il vous suffit d'ajouter à votre code cette ligne:
request.ContentLength = 0;
Habituellement, si vous n’envoyez aucune donnée, choisir la méthode GET
est plus sage, comme vous pouvez le constater dans HTTP RFC
var requestedURL = "https://accounts.google.com/o/oauth2/token?code=" + code + "&client_id=" + client_id + "&client_secret=" + client_secret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code";
HttpWebRequest authRequest = (HttpWebRequest)WebRequest.Create(requestedURL);
authRequest.ContentType = "application/x-www-form-urlencoded";
authRequest.Method = "POST";
//Set content length to 0
authRequest.ContentLength = 0;
WebResponse authResponseTwitter = authRequest.GetResponse();
La propriété ContentLength
contient la valeur à envoyer comme en-tête HTTP Content-length
avec la demande.
Toute valeur autre que -1 dans la propriété ContentLength
indique que la demande télécharge des données et que seules les méthodes qui téléchargent des données peuvent être définies dans la propriété Method.
Une fois que la propriété ContentLength
a été définie sur une valeur, ce nombre d'octets doit être écrit dans le flux de demandes renvoyé en appelant la méthode GetRequestStream
ou les méthodes BeginGetRequestStream
et EndGetRequestStream
.
pour plus de détails, cliquez ici
Hé, j'utilise Volley et j'obtenais l'erreur de serveur 411, j'ai ajouté à la méthode getHeaders la ligne suivante:
params.put("Content-Length","0");
Et ça a résolu mon problème
System.Net.WebException: The remote server returned an error: (411) Length Required.
C’est un problème assez courant qui se pose lorsque vous essayez de faire appeler un Méthode d'API basée sur REST via POST. Heureusement, il existe une solution simple pour celui-là.
C’est le code que j’utilisais pour appeler l’API de gestion Windows Azure . Cet appel d'API particulier nécessite que la méthode de requête soit définie en tant que POST, cependant, il n’ya pas d’information à envoyer au serveur.
var request = (HttpWebRequest) HttpWebRequest.Create(requestUri);
request.Headers.Add("x-ms-version", "2012-08-01"); request.Method =
"POST"; request.ContentType = "application/xml";
Pour corriger cette erreur, ajoutez une longueur de contenu explicite à votre demande avant de faire l'appel API.
request.ContentLength = 0;
J'ai eu la même erreur lorsque j'ai importé des requêtes Web de sessions capturées par un violoniste vers des tests Web Visual Studio. Certaines demandes POST n'avaient pas de balise StringHttpBody. J'ai ajouté un vide à eux et l'erreur avait disparu. Ajoutez ceci après la balise Headers:
<StringHttpBody ContentType="" InsertByteOrderMark="False">
</StringHttpBody>