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