Рекуррентный запрос 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 # и поэтому имею ограниченные знания об этом, пока я учусь, так что терпите меня!

Спасибо


person Ben Maxfield    schedule 11.09.2013    source источник


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

person Ben Maxfield    schedule 12.09.2013