0
I have a problem sending a json from my client application to my server API.
Json is generated correctly, and the POST request is made, but on the server side the following error is reported:
"message": "Ocorreu um erro.",
"exceptionMessage": "Não é possível associar o parâmetro 'dados_json'. É preciso especificar um binder de modelo personalizado para associar parâmetros do tipo 'StringContent'.",
"exceptionType": "System.InvalidOperationException",
"stackTrace": " em System.Web.Http.Controllers.HttpActionBinding.ExecuteBindingAsync(HttpActionContext actionContext, CancellationToken cancellationToken)\r\n em System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__5.MoveNext()\r\n--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---\r\n em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n em System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()"
The sending code of the Httppost request that runs client application is this:
async void ExecuteSalvarCommand()
{
try
{
var stringDados = await Task.Run(() => JsonConvert.SerializeObject(data));
var httpContent = new StringContent(stringDados, Encoding.UTF8, "application/json");
using (var httpClient = new HttpClient())
{
// Do the actual request and await the response
var httpResponse = await httpClient.PostAsync($"{ BaseUrl}salvar", httpContent);
// If the response contains content we want to read it!
if (httpResponse.IsSuccessStatusCode)
{
await App.Current.MainPage.DisplayAlert("Tlab", "Dados cadastrados com sucesso!", "OK");
ClearXML();
NSerie = "";
}
else
{
await App.Current.MainPage.DisplayAlert("Tlab", "Falha ao cadastrar dados, verifique sua conexão com a internet!", "OK");
}
}
}
The code that receives the POST on the server is this:
[HttpPost]
[Route("salvar")]
public HttpResponseMessage InsertorUpdate(StringContent dados_json)
{
if (Application.BD.Conectar())
return Request.CreateResponse(HttpStatusCode.Created, Application.Querys.Insert(dados_json));
else return Request.CreateResponse(HttpStatusCode.BadRequest, error);
}
The object that receives the Json information sent by the client application is this:
public class Relacao
{
public int tap { get; set; }
public double nominal { get; set; }
public double medido { get; set; }
public double ErroP { get; set; }
}
public class Identificador
{
[JsonProperty("num_serie")]
private string num_serie;
[JsonProperty("condicao")]
private string condicao;
[JsonProperty("tipo_relacao")]
private string tipo_rel;
public string Tipo_rel { set => tipo_rel = value; }
public string Condicao { set => condicao = value; }
public string Num_serie { set => num_serie = value; }
}
//Gerar Json
public class Dados
{
[JsonProperty("Identificador")]
public Identificador identificador = new Identificador();
[JsonProperty("objetos")]
public ObservableCollection<Relacao> objetos { get; set; }
}
Amigo creates a class with all the properties of his JSON and where he receives the request instead of receiving a Stringcontent type puts his created class.
– Maycon F. Castro
Got like this? [Httppost] [Route("save")] public Httpresponsemessage Insertorupdate(Data data_json) {
 if (Application.BD.Conectar())
 return Request.CreateResponse(HttpStatusCode.Created, Application.Querys.Insert(dados_json));
 else return Request.CreateResponse(HttpStatusCode.BadRequest, error);
 }
– Maycon F. Castro
@Mayconf.Castro yes, yes. I found where I was wrong, I had put an improper override. I got the data, thank you very much! How do I mark your comment as a response? kk (Obs: I’m new here in the community)
– Arthur Mapa
The JSON keys are identical with the names you put in the annotate [Jsonproperty]???
– Maycon F. Castro
@Mayconf.Castro edited the above comment. Gave straight, thank you very much!
– Arthur Mapa
Arthur I will put the comment as a response if possible please punctuate as a response.
– Maycon F. Castro
@Mayconf.Castro, done. Grateful!
– Arthur Mapa