Как вернуть объект Json в Web API Controller
Я использовал этот ниже код на моем контроллере asp.net, чтобы вернуть объект Json на мой Ajax на javascript
public JsonResult myMethod()
{
// return a Json Object, you could define a new class
return Json(new
{
Success = true, //error
Message = "Success" //return exception
});
}
Jquery-Ajax:
$.ajax({
type: "POST",
url: url_ ,
data: search,
success: function(data) {
//Show Json Properties from Controller ( If Success == false show exception Message from controller )
if (data.Success)
{
alert(data.Message); //display success
}
else
{
alert(data.Message) //display exception
}
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert("error: " + XMLHttpRequest.responseText);
},
dataType: 'json'
});
Как это можно сделать на Web Api Controller?
Можете ли вы привести несколько примеров или ссылок в качестве ссылки.
Спасибо и с уважением
Ответы
Ответ 1
Если вы создаете себе новый класс HttpContent для доставки JSON, например...
public class JsonContent : HttpContent {
private readonly MemoryStream _Stream = new MemoryStream();
public JsonContent(object value) {
Headers.ContentType = new MediaTypeHeaderValue("application/json");
var jw = new JsonTextWriter( new StreamWriter(_Stream));
jw.Formatting = Formatting.Indented;
var serializer = new JsonSerializer();
serializer.Serialize(jw, value);
jw.Flush();
_Stream.Position = 0;
}
protected override Task SerializeToStreamAsync(Stream stream, TransportContext context) {
return _Stream.CopyToAsync(stream);
}
protected override bool TryComputeLength(out long length) {
length = _Stream.Length;
return true;
}
}
Тогда вы можете сделать,
public HttpResponseMessage Get() {
return new HttpResponseMessage() {
Content = new JsonContent(new
{
Success = true, //error
Message = "Success" //return exception
})
};
}
так же, как и с JsonResult.
Ответ 2
ASP.NET Web API работает с немного другой философией. Вы должны вернуть только сущность (или набор сущностей), и механизм согласования контента должен вернуть его клиенту в том формате, который он запросил. Подробнее о переговорах по содержимому вы можете прочитать здесь:
Вы можете, конечно, обходить недопустимость содержимого, возвращая HttpResponseMessage
. В этом случае вам нужно сериализовать объект непосредственно в JSON (основы этого подхода также описаны в упомянутой выше статье).
Ответ 3
После прочтения ответа tpeczek, ответа Даррела Миллера и их комментария в ответе tpeczek, я хотел получить больше рекомендаций о том, когда и почему я могу использовать Web Api и его механизм согласования контента. Ссылка tpeczek информативна и полезна, но я нашел пару других рецензий, которые были более ориентированы на сравнение использования Web Api (и его согласования содержимого) с, скажем, с обычными действиями контроллера MVC 4, которые возвращают JsonResult
. Вот те, которые я нашел полезными для принятия такого решения. Один из авторов приходит к выводу, что он предпочитает использовать простые контроллеры MVC 4, в то время как другой автор предпочитает использовать контроллеры Web Api:
Создание общедоступного HTTP-API для данных
Я считаю, что в вышеупомянутом сообщении автора есть одна коррекция. Там он упоминает, что
"... каждый метод [Controller], который начинается с" Get ", автоматически связанный с глаголом GET. Звучит здорово? Это так, но это также означает, что у вас нет двух методов, чье имя начинается с" Get" в тот же класс контроллера.
В соответствии с этим ответом у вас действительно может быть несколько методов Get в одном контроллере, если вы укажете атрибут ActionName
, Теперь вот второе сообщение:
API ASP.NET Web API и API-интерфейсы ASP.NET MVC