0

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

谢谢

4

1 回答 1

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

于 2013-09-12T13:12:14.970 回答