私は C#/.NET で Recurly API ( http://docs.recurly.com/api ) を実装していますが、V2 の .NET サポートがないにもかかわらず、これまでのところうまくいきました。
API の大部分を正常に実装できましたが、ユーザー アカウントの変更または更新に PUT 要求を使用すると問題が発生します。
GET および POST リクエストは完全に機能し、アカウントの作成に対して httpStatusCode 200 を受け取り、「GET」したデータに対して適切な XML を受け取ります。
ただし、たとえば、PUT 要求を使用してサブスクリプションを再アクティブ化しようとすると、Recurly 内のサブスクリプションは要求どおりに再アクティブ化されますが、返される応答は http ステータス コード 500 です。
The server encountered an error while processing your request and failed.
この問題は、以下のコードの定義に関連していると思われますrequest.ContentLength = 0;
が、リクエストで実際のコンテンツ本体を指定または送信していません。
サブスクリプションを定義する前ContentLength = 0
は、再アクティブ化されず、411 Length Required エラーが発生しました (したがって、コンテンツの長さを追加しました)。
ドキュメントには、適切な URI に put リクエストを送信するためだけに、PUT リクエスト内でエンティティ (正しい用語だと思います) を指定することについては何も記載されていません。
私は少し行き詰まっており、空の文字列、XML ファイル (サブスクリプションの詳細の再作成) を組み込んで要求と共に送信しようとしましたが、エラーが返されるだけのようです。
PUTリクエスト内のエンティティに関してRecurlyが何を望んでいるのかわからないため、私は途方に暮れています.PUTというContentLength
印象を受けていたので、定義されている限り、エンティティがなくても機能します。 POST のように body が必要でしたが、いくつかの調査を行った結果、これは必要ないかもしれないと言う人がいることがわかりました。
Recurly 内で実際の要求が機能しているにもかかわらず、コードの残りの部分で検証に必要な応答 (httpStatusCode 200) を取得できません。
コンテンツ長が 0 の空の文字列または空の本文を送信して、サーバー エラーが発生しないようにすることは可能ですか。とにかくサブスクリプションが再アクティブ化されるため、冗長に見えます。
uri = "https://" + subdomain + ".recurly.com/v2/subscriptions/" + uuid + "/reactivate";
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Headers.Add("Authorization", "Basic " + encodeB64);
request.Method = "PUT";
request.ContentType = "text/XML";
request.ContentLength = 0;
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
編集:他に試したことの例
uri = "https://" + subdomain + ".recurly.com/v2/subscriptions/" + uuid + "/reactivate";
try
{
string xml = "<subscription><timeframe>now</timeframe></subscription>"; //also tried with blank string.
byte[] arr = System.Text.Encoding.UTF8.GetBytes(xml);
HttpWebRequest renewRequest = (HttpWebRequest)WebRequest.Create(uri);
renewRequest.Headers.Add("Authorization", "Basic " + encodeB64);
renewRequest.Method = "PUT";
renewRequest.ContentType = "text/XML";
renewRequest.ContentLength = arr.Length;
Stream datastream = renewRequest.GetRequestStream();
datastream.Write(arr, 0, arr.Length);
datastream.Close();
HttpWebResponse renewResponse = (HttpWebResponse)renewRequest.GetResponse();
}
補足として、私はC#を初めて使用するため、学習中はC#に関する知識が限られているため、ご容赦ください。
ありがとう