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