我正在 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 错误(因此我添加了内容长度)。
该文档没有说明在 PUT 请求中指定任何实体(我认为这是正确的术语),只是将put请求发送到适当的 URI。
我陷入了僵局,并尝试将一个空白字符串、XML 文件(重新创建订阅详细信息)与请求一起发送,但我似乎除了返回错误之外什么也没有得到。
我很茫然,因为我不知道 Recurly 在 PUT 请求中的实体方面想要什么,而且只要ContentLength
定义了它就可以工作,这对我来说没有多大意义,因为我印象中是 PUT像 POST 一样需要一个主体,尽管在做了一些研究后我发现有些人提到这可能没有必要。
尽管实际请求在 Recurly 中工作,但我无法在我的其余代码中获得验证所需的响应(httpStatusCode 200)。
是否可以发送内容长度为 0 的空白字符串或空正文而不会出现服务器错误,或者我是否需要以某种方式找到要发送给 Recurly 的内容,请求返回可接受的响应状态代码,尽管后者无论如何,订阅都会重新激活,这似乎是多余的。
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# 的新手,因此在学习时对它的了解有限,所以请耐心等待!
谢谢