web-dev-qa-db-fra.com

Pourquoi ai-je l'erreur 411 Length required?

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?

37
markzzz

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;
65
Atlasmaybe

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

22
Ehsan

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

11
Save
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

3
Musakkhir Sayyed

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 

1
shimi_tap

Recherche Google

2ème résultat

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;

0
iabbott

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>
0
Youcef Kelanemer