web-dev-qa-db-ja.com

C#でのRESTful / HTTPリクエストでのヘッダーと投稿データの追加

POSTリクエストをC#で送信するときに問題が発生し、HTTPの基本を誤解しているようです。基本的に、RESTfullサービスclientを実装しています。これは次のように機能します:

  1. POSTリクエストをユーザー名/パスワードで行い、トークンを取得する
  2. 他のGET/POST/PUTリクエストを行う間、このトークンをヘッダー(Authorization:TOKEN)で使用します

私はWebRequestを使用して(Authorizationヘッダー付きで)GETリクエストを作成し、それが機能しています。しかし、次のコードを使用してPUT要求を行うと、サービスから「認証に失敗しました-ログインしていません」というメッセージが返されます。

String url = String.Format("{0}/{1}", AN_SERVER, app);
WebRequest theRequest = WebRequest.Create(url);
theRequest.Method = "POST";

theRequest.ContentType = "text/x-json";
theRequest.ContentLength = json.Length;
Stream requestStream = theRequest.GetRequestStream();

requestStream.Write(Encoding.ASCII.GetBytes(json), 0, json.Length);
requestStream.Close();


theRequest.Headers.Add("Authorization", authToken);

HttpWebResponse response =  (HttpWebResponse)theRequest.GetResponse();

POSTリクエストを送信しているときに、私は小さな間違いを犯しているはずです(少なくともそう願っています)。

ありがとう。

19
Azho KG

リクエストストリームが本文を追加しているため、リクエストスチームが機能する前にヘッダーを移動する(AI Wのコメントによる)。

Webrequestが内部的に実装される方法では、本文を書き込む前にヘッダーを終了する必要があり、ストリーム形式になったら、送信する準備ができています。

リフレクターまたはそのような逆コンパイルツールでのwebrequestの実装を見ると、ロジックを確認できます。

お役に立てれば

10
stevenrcfox