Recurly PUT请求工作但返回服务器错误

时间:2013-09-11 10:38:02

标签: c# .net http put recurly

我在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#的新手,因此在我学习的过程中对它的了解有限,所以请耐心等待!

由于

1 个答案:

答案 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标头,这似乎解决了内部服务器错误消息。