【问题标题】:Recurly PUT request working but returning server error重复 PUT 请求工作但返回服务器错误
【发布时间】:2013-09-15 08:15:15
【问题描述】:

我正在 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 请求中指定任何实体(我认为这是正确的术语),只是将 a put 请求发送到适当的 URI。

我陷入了僵局,并尝试将一个空白字符串、XML 文件(重新创建订阅详细信息)与请求一起发送,但我似乎只返回了错误。

我不知所措,因为我不知道 Recurly 在 PUT 请求中的实体方面想要什么,只要定义了 ContentLength,它就可以在没有实体的情况下工作,这对我来说没有多大意义我的印象是 PUT 和 POST 一样需要一个主体,尽管在做了一些研究后我发现有些人提到这可能没有必要。

我只是无法在我的其余代码中获得验证所需的响应 (httpStatusCode 200),尽管实际请求在 Recurly 中工作。

是否可以发送内容长度为 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# 新手,因此在学习期间对 C# 的了解有限,所以请耐心等待!

谢谢

【问题讨论】:

    标签: c# .net http put recurly


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-06-05
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多