Marcelo C Fernandes Marcelo C Fernandes - 3 months ago 21
reST (reStructuredText) Question

Empty data doesn´t return nothing in webapi Xamarin

I am using Xamarin and i constructed a webapi ! I have a lot of Entrys, but when the user doesn´t write one/more of them, i am not passing nothing on URL (get), because the value goes NULL.

EXAMPLE: i Have the entrys Name (namesearch), Mothers name(momsName), Father´s name(dadName) ... the user write the Name and the father´s Name...my service construct the URL based on them localhost/1762/api/nomes/Envolvidos?namesearch=testing&momsName=&dadName=testing
When i do this momsName= , i don´t return nothing in JSON!!!! But i want to return all the datas that has "namesearch=testing" and "dadName=testing"
If i write the name of Mother, return is ok.
My WebApi code is:
namespace WebApiApp.Controllers
{

[RoutePrefix("api/nomes")]
public class NomesController : ApiController
{

Envolvidos[] envolvidos = new Envolvidos[]
{
new Envolvidos {NomePesquisa = "Teste", NomeMae = "mae", NomePai = "pai", DtNasc = "01/01/2000", NRg = "111", NCpf="1000", NRo="009-1010/2016", MdPendente=0},
new Envolvidos {NomePesquisa = "Teste", NomeMae = "mae", NomePai = "pai", DtNasc = "01/01/2000", NRg = "222", NCpf="1111", NRo="009-1010/2016", MdPendente=1},
new Envolvidos {NomePesquisa = "Teste Ferreira", NomeMae = "mae teste", NomePai = "pai", DtNasc = "01/01/2000", NRg = "333"/*, NCpf="1222", NRo="009-1010/2016" ,MdPendente=false*/},
new Envolvidos {NomePesquisa = "Teste2", NomeMae = "teste mae",NomePai = "teste pai", DtNasc = "01/01/2000", NRg = "444"/*, NCpf="1333", NRo="009-1010/2016" ,MdPendente=true*/},
new Envolvidos {NomePesquisa = "Teste de Teste", NomeMae = "teste mae",NomePai = "pai", DtNasc = "01/01/2000", NRg = "555"/*, NCpf="1444", NRo="009-1010/2016" ,MdPendente=true*/}
};

[HttpGet]
[Route("Envolvidos")]
public IEnumerable<Envolvidos> GetEnvolv(string nomePesquisa, string nomeMae, string nomePai, string dtnasc
, string nRG, string nCPF)
{
return envolvidos.Where((p) =>
string.Equals(p.NomePesquisa, nomePesquisa, StringComparison.OrdinalIgnoreCase)&&
string.Equals(p.NomeMae, nomeMae, StringComparison.OrdinalIgnoreCase)&&
string.Equals(p.NomePai, nomePai, StringComparison.OrdinalIgnoreCase)&&
string.Equals(p.DtNasc, dtnasc, StringComparison.OrdinalIgnoreCase)&&
string.Equals(p.NRg, nRG, StringComparison.OrdinalIgnoreCase)&&
string.Equals(p.NCpf, nCPF, StringComparison.OrdinalIgnoreCase));
}

}
}


My Service

namespace AppMobile.Services
{
public class ApiCall
{
static readonly string ApiUrl = "http://XXX:1762/api/{0}/{1}?nomePesquisa={2}&nomeMae={3}&nomePai={4}&dtNasc={5}&nrg={6}&ncpf={7}";

public async Task<T> GetResponse<T>(string controller, string method, string nomepesquisa,
string nomemae, string nomepai, string dtnasc, string nrg, string ncpf) where T : class
{
var client = new System.Net.Http.HttpClient();

//Definide o Header de resultado para JSON, para evitar que seja retornado um HTML ou XML
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

//Formata a Url com o metodo e o parametro enviado e inicia o acesso a Api. Como o acesso será por meio
//da Internet, pode demorar muito, para que o aplicativo não trave usamos um método assincrono
//e colocamos a keyword AWAIT, para que a Thread principal - UI - continuo sendo executada
//e o método so volte a ser executado quando o download das informações for finalizado
var urllink = string.Format(ApiUrl, controller, method, nomepesquisa, nomemae, nomepai, dtnasc, nrg, ncpf);
var response = await client.GetAsync(urllink);

//Lê a string retornada
var JsonResult = response.Content.ReadAsStringAsync().Result;

if (typeof(T) == typeof(string))
return null;

//Converte o resultado Json para uma Classe utilizando as Libs do Newtonsoft.Json
var rootobject = JsonConvert.DeserializeObject<T>(JsonResult);
return rootobject;
}
}
}

Answer

Try something like this - you want to test if an argument is null OR if it matches

return envolvidos.Where((p) => 

 (string.IsNullOrEmpty(nomePesquisa) || string.Equals(p.NomePesquisa, nomePesquisa, StringComparison.OrdinalIgnoreCase))

&&

 (string.IsNullOrEmpty(nomeMae) || string.Equals(p.NomeMae, nomeMae, StringComparison.OrdinalIgnoreCase))

&&

// add other cases here...
Comments