これは、.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)長さが必要です。
私は何をすべきか?
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;
リクエストヘッダーにContent-Length: 0
を追加する必要があります。
テスト方法の非常に説明的な例が与えられます here
POST
HttpWebRequestを作成する場合、送信するデータの長さを次のように指定する必要があります。
string data = "something you need to send"
byte[] postBytes = Encoding.ASCII.GetBytes(data);
request.ContentLength = postBytes.Length;
データを送信しない場合は、0に設定するだけです。つまり、次の行にコードを追加するだけです。
request.ContentLength = 0;
通常、データを送信しない場合、 HTTP RFC でわかるように、代わりにGET
メソッドを選択する方が賢明です。
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ヘッダーとして送信する値が含まれます。
ContentLength
プロパティの-1以外の値は、リクエストがデータをアップロードし、データをアップロードするメソッドのみがMethodプロパティで設定できることを示します。
ContentLength
プロパティを値に設定した後、そのバイト数を、GetRequestStream
メソッドまたはBeginGetRequestStream
メソッドとEndGetRequestStream
メソッドの両方を呼び出して返される要求ストリームに書き込む必要があります。
詳細については、 こちら をクリックしてください
メソッドのリクエスト方法をPOSTからGETに変更します。
ちょっと私はVolleyを使用していて、サーバーエラー411を受け取っていたので、getHeadersメソッドに次の行を追加しました。
params.put("Content-Length","0");
そしてそれは私の問題を解決しました
System.Net.WebException: The remote server returned an error: (411) Length Required.
これは、POSTを介してRESTベースのAPIメソッドを呼び出そうとすると発生する非常に一般的な問題です。幸いなことに、これには簡単な修正があります。
これは、Windows Azure管理APIを呼び出すために使用していたコードです。この特定の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;
Web要求をフィドラーキャプチャセッションからVisual Studio Webテストにインポートしたときにも同じエラーが発生しました。一部のPOSTリクエストには、StringHttpBodyタグがありませんでした。空のものを追加しましたが、エラーはなくなりました。これをヘッダータグの後に追加します。
<StringHttpBody ContentType="" InsertByteOrderMark="False">
</StringHttpBody>