Почему я получаю ошибку 411 Length required?
Вот как я вызываю службу с .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();
но когда этот метод вызывается, я получаю:
Сведения об исключении: System.Net.WebException: Вернулся удаленный сервер ошибка: (411) Требуемая длина.
что мне делать?
Ответы
Ответ 1
Когда вы используете метод HttpWebRequest и POST, вам нужно установить контент (или тело, если хотите) через RequestStream. Но, согласно вашему коду, использование authRequest.Method = "GET" должно быть достаточно.
Если вам интересно о формате POST, вот что вам нужно сделать:
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;
Ответ 2
вам нужно добавить Content-Length: 0
в свой заголовок запроса.
показан очень описательный пример того, как тестировать здесь
Ответ 3
Когда вы создаете POST
HttpWebRequest, вы должны указать длину данных, которые вы отправляете, например:
string data = "something you need to send"
byte[] postBytes = Encoding.ASCII.GetBytes(data);
request.ContentLength = postBytes.Length;
если вы не отправляете какие-либо данные, просто установите его на 0, это означает, что вам просто нужно добавить к вашему коду эту строку:
request.ContentLength = 0;
Обычно, если вы не отправляете какие-либо данные, вместо этого метод GET
является более мудрым, как вы можете видеть в HTTP RFC
Ответ 4
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();
Свойство ContentLength
содержит значение для отправки в качестве заголовка Content-length
HTTP с запросом.
Любое значение, отличное от -1 в свойстве ContentLength
, указывает, что запрос загружает данные и что в свойстве Method могут быть установлены только методы, которые загружают данные.
После того, как свойство ContentLength
установлено в значение, это количество байтов должно быть записано в поток запросов, который возвращается путем вызова метода GetRequestStream
или обоих методов BeginGetRequestStream
и EndGetRequestStream
.
для более подробной информации нажмите здесь
Ответ 5
Поиск Google
2-й результат
System.Net.WebException: The remote server returned an error: (411) Length Required.
Это довольно распространенная проблема, возникающая при попытке сделать вызов Метод API на основе REST через POST. К счастью, есть простое решение для этот.
Это код, который я использовал для вызова API управления Windows Azure. Этот конкретный вызов API требует, чтобы метод запроса был установлен как POST, однако нет информации, которую необходимо отправить в сервер.
var request = (HttpWebRequest) HttpWebRequest.Create(requestUri);
request.Headers.Add("x-ms-version", "2012-08-01"); request.Method =
"POST"; request.ContentType = "application/xml";
Чтобы исправить эту ошибку, добавьте явную длину содержимого к вашему запросу перед вызовом API.
request.ContentLength = 0;
Ответ 6
Эй, я использую Volley и получаю ошибку сервера 411, я добавил к методу getHeaders следующую строку:
params.put("Content-Length","0");
И он решил мою проблему