我在C#/ .NET中实现了Recurly API(http://docs.recurly.com/api),尽管缺乏对.NET的.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长度要求的错误(因此我添加了内容长度)。
文档没有说明在PUT请求中指定任何实体(我认为这是正确的术语),只是将 a put请求发送到适当的URI。
我陷入了一些僵局,并尝试合并一个空白字符串,XML文件(重新订阅订阅细节)与请求一起发送,但我似乎什么都没得到,但错误已经返回。
我很茫然,因为我不知道PUT请求中的实体对Recurly的要求是什么,只要定义了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#的新手,因此在我学习的过程中对它的了解有限,所以请耐心等待!
由于
答案 0 :(得分:0)
对于因缺乏API或文档知识而陷入困境的其他人,看起来我的某些标题错误/缺失。
以下是满足Recurly服务器的代码。
try
{
HttpWebRequest renewRequest = (HttpWebRequest)WebRequest.Create(uri);
renewRequest.Headers.Add("Authorization", "Basic " + encodeB64);
renewRequest.Method = "PUT";
renewRequest.ContentLength = 0;
renewRequest.UserAgent = "mylib/1.0";
renewRequest.Host = "XXXX.recurly.com";
renewRequest.Accept = "application/xml";
HttpWebResponse renewResponse = (HttpWebResponse)renewRequest.GetResponse();
}
正如您所见,Accept标头现在是application / xml,并且缺少userAgent标头,这似乎解决了内部服务器错误消息。