ASP.NET WebAPI: как управлять содержимым строки, возвращаемым клиенту?
В WebAPI скажу, что я возвращаю строку, завернутую в ответ HTTP:
return Request.CreateResponse(HttpStatusCode.BadRequest, "Line1 \r\n Line2");
При вызове этого действия из jQuery текст ответа обрабатывается до его возвращения. Поэтому в xhr я получаю что-то вроде этого:
function success(xhr) {
alert(xhr.responseText); // alerts ""Line1 \\r\\n Line2""
}
Иными словами, строка обертывается в двойные кавычки, а специальные символы получают экранированные, чтобы они отображались на выходе (фактическое предупреждение - "Line1\r\n Line2", поэтому строки новой строки не сохраняются, а скорее закодированы и показано в тексте ответа).
Я могу обойти это, удалив кавычки и заменив новые строки на клиенте так:
var responseText = xhr.responseText.substr(1, xhr.responseText - 2)
.replace('\\r', '\r').replace('\\n', '\n');
Но есть ли способ сказать WebAPI как форматировать ответы на строки? Например, чтобы не обернуть их в двойные кавычки и преобразовать экранированные символы?
Ответы
Ответ 1
Это происходит потому, что ваш контроллер возвращает JSON, в котором указаны строковые значения.
Простое решение состоит в том, чтобы проанализировать responseText
как JSON, а затем вы можете использовать значение по своему усмотрению:
$.ajax("/api/values/10", {
error: function (xhr) {
var error = JSON.parse(xhr.responseText);
$("textarea").val(error);
}
});
Это правильно интерпретирует разрывы строк/возврат каретки.
В качестве альтернативы вы можете указать тип носителя text/plain
в вашем контроллере:
return Request.CreateResponse(
HttpStatusCode.BadRequest,
"Line1 \r\n Line2", "text/plain");
Затем Web API попытается загрузить соответствующий формат медиафайлов для text/plain
, который, к сожалению, не существует OOTB. Вы найдете его в WebApiContrib.
Ответ 2
Зачем вам нужен пользовательский MediaTypeFormatter. Похоже, вы хотите реализовать свой собственный пользовательский для замены и существующего или вы создаете новый настраиваемый все вместе в зависимости от того, что ожидается в заголовке Accept. Хорошая новость заключается в том, что вы можете заменить существующие или создать новый MediaType. Несколько мест, которые помогут вам начать, можно найти здесь:
http://byterot.blogspot.com/2012/04/aspnet-web-api-series-part-5.html
http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters
Да, я на самом деле сделал это в малой части, поскольку я поменял некоторые форматы форматирования по умолчанию, например. JSON с более быстрым, то есть ServiceStack, и он отлично работает.