c# - net - web api post json
Cómo pasar objetos complejos a ASP.NET WebApi GET desde jQuery ajax call? (2)
Tengo el siguiente objeto complejo en JavaScript que contiene opciones de filtro
var filter={caseIdentifiter:''GFT1'',userID:''2''};
que quiero pasar a un controlador ASP.NET MVC4 WebApi OBTENER
[HttpGet]
public IEnumerable<JHS.Repository.ViewModels.CaseList> Get([FromBody]Repository.InputModels.CaseListFilter filter)
{
try
{
return Case.List(filter);
}
catch (Exception exc)
{
//Handle exception here...
return null;
}
}
usando una llamada jQuery ajax
var request = $.ajax({
url: http://mydomain.com/case,
type: ''GET'',
data: JSON.stringify(filter),
contentType: ''application/json; charset=utf-8'',
cache: false,
dataType: ''json''
});
El objeto "filtro" en el método de controlador ASP.NET es "nulo". Si lo cambio a un POST, el objeto de filtro se pasa correctamente. ¿Hay alguna forma de pasar un objeto complejo a un GET?
No quiero separar los parámetros en la URL ya que habrá una cantidad de ellos que lo haría ineficiente, sería difícil tener parámetros opcionales, y de esta manera la firma del método se mantiene constante incluso si se agregan nuevos parámetros.
Después de encontrar esta pregunta / respuesta de
Tipo complejo obtiene nulo en un parámetro ApiController
el atributo [FromBody] en el método del controlador debe ser [FromUri] ya que un GET no tiene un cuerpo. Después de este cambio, el objeto complejo "filtro" se pasa correctamente.
Si anexa datos json a la cadena de consulta, y los analiza más adelante en el lado de la API web. puedes analizar objetos complejos. Es útil en lugar de estilo de objeto post json. Esta es mi solución.
//javascript file
var data = { UserID: "10", UserName: "Long", AppInstanceID: "100", ProcessGUID: "BF1CC2EB-D9BD-45FD-BF87-939DD8FF9071" };
var request = JSON.stringify(data);
request = encodeURIComponent(request);
doAjaxGet("/ProductWebApi/api/Workflow/StartProcess?data=", request, function (result) {
window.console.log(result);
});
//webapi file:
[HttpGet]
public ResponseResult StartProcess()
{
dynamic queryJson = ParseHttpGetJson(Request.RequestUri.Query);
int appInstanceID = int.Parse(queryJson.AppInstanceID.Value);
Guid processGUID = Guid.Parse(queryJson.ProcessGUID.Value);
int userID = int.Parse(queryJson.UserID.Value);
string userName = queryJson.UserName.Value;
}
//utility function:
public static dynamic ParseHttpGetJson(string query)
{
if (!string.IsNullOrEmpty(query))
{
try
{
var json = query.Substring(7, query.Length - 7); //seperate ?data= characters
json = System.Web.HttpUtility.UrlDecode(json);
dynamic queryJson = JsonConvert.DeserializeObject<dynamic>(json);
return queryJson;
}
catch (System.Exception e)
{
throw new ApplicationException("can''t deserialize object as wrong string content!", e);
}
}
else
{
return null;
}
}