{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}
22/12/2010
DISCLAIMER: Se você não sabe o que é GET, POST, PUT, DELETE, entre outros dê um pulinho aqui.
Quando trabalhamos com Ajax em nossas aplicações (sejam MVC ou não) precisamos decidir sobre qual o método/verbo HTTP será utilizado: GET ou POST. Resumidamente se nossa requisição não vai modificar nada no servidor então realizamos uma requisição do tipo GET.
Em ASP.NET MVC esta tarefa é bastante simples, principalmente quando utilizamos também o Jquery(já falei dele aqui, aqui e aqui). Existem alguns detalhes importantes que devem ser levados em consideração e abordaremos.
O controller que utilizaremos é bastante simples:
public class HomeController : Controller{
public ActionResult Index() {
return View();
}
[HttpGet]
public ActionResult DadosEmJson() {
return Json(new {Nome = "Vinicius", Twitter = "@vquaiato"});
}
}
Vejam que temos uma action, que só pode ser acessa via GET e que simplesmente retorna alguns dados em formato Json. Estamos retornando um anonymous object com as informações que queremos, bastante simples.
A view que consome nossa action via GET usando Jquery é bastante simples também e todo o segredo está aqui neste trecho de código javascript usando Jquery:
$(function () {
var url = '@Url.Action("DadosEmJson","Home")';
$.get(url, function(dados){
$("#nome").append(dados.Nome);
$("#twitter").append(dados.Twitter);
});
});
Pronto! Estamos executando uma requisição GET para nossa action e obtendo dados em formato Json. Tudo isso é feito com a utilização da função get do Jquery. Esta função nada mais é do que um atalho para a função ajax.
Por razões de segurança não é possível retornar de forma automática dados Json em requisições GET.
Para contornar esse problema basta permitir o retorno de dados Json em requisições do tipo GET. Fazemos isso alterando nossa action conforme abaixo:
[HttpGet]
public ActionResult DadosEmJson(){
return Json(new {Nome = "Vinicius", Twitter = "@vquaiato"},JsonRequestBehavior.AllowGet);
}
Pronto, agora tudo funciona!
Tudo está funcionando perfeitamente, o problema é que não é confiável e nem recomendável retornar dados Json via GET.
Existe uma falha de segurança que pode ser explorada nesta situação: Json Hijacking. Estou mostrando como fazer, mas se possível evite esse tipo de uso para o Json.
É possível retornar Json via POST normalmente e sem esses problemas todos. No geral esta é uma falha explorada quando se retornam coleções via Json(existem uma série de outros fatores que precisam ocorrer para que isso aconteça, mas é bom não dar mole).
Se você precisar mesmo retornar uma coleção via Json e precisar mesmo que ela seja retornada usando GET coloque seu conteúdo dentro de uma propriedade:
[HttpGet]
public ActionResult DadosEmJsonPropriedade(){
var dados = new[] { "ASP.NET MVC", "ASP.NET MVC 3", "Jquery" };
return Json(new { Dados = dados }, JsonRequestBehavior.AllowGet);
}
Vejam que colocamos nossa coleção dentro de uma propriedade Dados no objeto que será serializado para Json. Isso só não basta mas ajuda a previnir o Json Hijacking.
É preciso habilitar retorno de Json via GET na action. É preciso tomar cuidado com Json Hijacking. Se possível, evite retornar Json via GET. É isso aê galera, depois mostro como é "difícil" fazer o mesmo com POST.
Abraços,
Vinicius Quaiato.