Повторно PUT-запрос работает, но возвращается ошибка сервера

Я реализую Recurly API ( http://docs.recurly.com/api) в C#/.NET, и до сих пор он работал очень хорошо, несмотря на отсутствие поддержки.NET для V2.

Мне удалось успешно реализовать большинство API, но я столкнулся с проблемой использования запросов PUT для изменения или обновления учетных записей пользователей.

Мои запросы GET и POST работают отлично, и я получаю httpStatusCode 200 для создания учетной записи и получаю соответствующие 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, только для того, чтобы отправить запрос на размещение в соответствующий 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# и, следовательно, имею ограниченные знания об этом, пока я учусь, так что терпите меня!

Спасибо

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 отсутствовал, и это, похоже, устранило сообщение об ошибке внутреннего сервера.

Другие вопросы по тегам