• 0
RodrigoNascimento

Alteração de estoque via SDK .NET

Question

Olá!

Estou tentando atualizar o estoque de um produto via SDK .NET e não estou conseguindo. Pelo Postman consigo fazer tudo perfeitamente, mas quando executo os mesmos comandos pelo SDK não funciona.

Esse é meu código:

protected void AlterarEstoque(Meli meli, string ID, int quantidade)
        {
            // Cria parâmetro com o access token
            RestSharp.Parameter token = new RestSharp.Parameter();
            token.Name = "access_token";
            token.Value = meli.AccessToken;

            // Cria lista de parâmetros que devem ser passados para o POST
            List<RestSharp.Parameter> parameter = new List<RestSharp.Parameter>();
            parameter.Add(token);

            // Cria o objeto JSON que deve ser passado como body
            JObject json = new JObject();
            json["available_quantity"] = quantidade;

            // Faz request para obter usuário de teste
            IRestResponse response = meli.Put($"/items/{ID}", parameter, json);

            // Transforma as informações recebidas em JSON
            JObject j = JObject.Parse(response.Content);
            textBox.Text = j.ToString(Formatting.Indented);
        }

Essa é a resposta:

{
  "message": "body.invalid",
  "error": "The format is not correct",
  "status": 400,
  "cause": []
}

Pelo SDK, apenas os comandos via GET funcionam, PUT e POST não e DELETE não usei.

Share this post


Link to post
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Consegui resolver. O problema está no SDK.

Nos métodos PUT e POST troquei a seguinte linha:

request.AddBody (body);

Por essa:

request.AddParameter("application/json", body, ParameterType.RequestBody);

Com a correção, os métodos completos ficam assim:

public IRestResponse Post (string resource, List<Parameter> param, object body)
{
  bool containsAT = false;

  var request = new RestRequest (resource, Method.POST);
  List<string> names = new List<string> ();
  foreach (Parameter p in param) {
    names.Add (p.Name + "={" + p.Name + "}");
    if (p.Name.Equals ("access_token")) {
      containsAT = true;
    }
    p.Type = ParameterType.UrlSegment;
    request.AddParameter (p);
  }

  request.Resource = resource + "?" + String.Join ("&", names.ToArray ());

  request.AddHeader ("Accept", "application/json");
  request.AddHeader ("Content-Type", "application/json");
  request.RequestFormat = DataFormat.Json;

  request.AddParameter("application/json", body, ParameterType.RequestBody);

  var response = ExecuteRequest (request);



  return response;
}

public IRestResponse Put (string resource, List<Parameter> param, object body)
{
  bool containsAT = false;

  var request = new RestRequest (resource, Method.PUT);
  List<string> names = new List<string> ();
  foreach (Parameter p in param) {
    names.Add (p.Name + "={" + p.Name + "}");
    if (p.Name.Equals ("access_token")) {
      containsAT = true;
    }
    p.Type = ParameterType.UrlSegment;
    request.AddParameter (p);
  }

  request.Resource = resource + "?" + String.Join ("&", names.ToArray ());

  request.AddHeader ("Accept", "application/json");
  request.AddHeader ("Content-Type", "application/json");
  request.RequestFormat = DataFormat.Json;

  request.AddParameter("application/json", body, ParameterType.RequestBody);

  var response = ExecuteRequest (request);



  return response;
}

 

Share this post


Link to post
Share on other sites
  • 0
3 hours ago, RodrigoNascimento said:

IRestResponse response = meli.Put($"/items/{ID}", parameter, json);

no SDK PHP é invertido e para o seu esquema ficaria assim:
IRestResponse response = meli.Put($"/items/{ID}", json, parameter);

Share this post


Link to post
Share on other sites
  • 0

@RodrigoNascimento, na nossa integração (também em .NET), utilizamos o SDK apenas para autenticar e obter uma AccessToken nova de tempos em tempos. Nada mais.

 

O SDK é muito crú para uma integração estável, então acabamos desenvolvendo tudo do zero.

 

E ficou melhor. :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now