none
Usar API Rest - C# RRS feed

  • Pergunta

  • Pessoal,

    preciso de uma ajuda urgente, por favor!

    Estou usando uma API do cliente com o seguinte endereço:

    https://oms.vtexcommercestable.com.br/api/oms/pvt/orders/{id}/changes?an=loja

    Então quando eu uso Postman eu passo o endereço abaixo:

    https://oms.vtexcommercestable.com.br/api/oms/pvt/orders/v500280orgn-01/changes?an=organomix

    E também numa aba chamada RAW eu uso o seguinte Json como parâmetro:

    {
      "reason": "Teste de Troca",
      "discountValue": 387,
      "itemsRemoved": [
        {
          "id": "2000889",
          "quantity": 1,
          "price": 591
       }
      ],
      "itemsAdded": [
        {
          "id": "106902",
          "quantity": 1,
          "price": 204
        }
      ]
    }

    Senhores, como eu uso isto em C#, eu tentei com o seguinte código:

                    

     string result = "";
                using (var client = new WebClient())
                {

                    client.Headers[HttpRequestHeader.ContentType] = "application/json";
                    result = client.UploadString("http://oms.vtexcommercestable.com.br/api/oms/pvt/orders/v500280orgn-01/changes?an=organomix", "POST", json);
                }

    E me retorna um erro 400 http, como faço isto? Encontro exemplos mas não funciona!

    quinta-feira, 12 de março de 2015 13:03

Respostas

Todas as Respostas

  • Tem certeza que voce tem que usar "POST"?? Tente usar "GET"

    Para trabalhar com JSON eu sugiro importar o Json.NET (utilize o NUGET) no seu projeto..

    De uma olhada neste artigo:

    http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client

    Aqui esta um exemplo do que eu acho que deveria ser seu codigo:

    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri("http://oms.vtexcommercestable.com.br/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
        // New code:
        HttpResponseMessage response = await client.GetAsync("api/oms/pvt/orders/v500280orgn-01/changes?an=organomix");
        if (response.IsSuccessStatusCode)
        {
            //Product product = await response.Content.ReadAsAsync>Product>();
            //Console.WriteLine("{0}\t${1}\t{2}", product.Name, product.Price, product.Category);
        }
    }

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------


    quinta-feira, 12 de março de 2015 13:14
    Moderador
  • William bom dia!

    Eu passo o Json corretamente como dito acima, este método ele vai atualizar um Produto no Pedido, no POSTMAN não sei se você já ouviu falar eu uso o POST para realizar o procedimento e funciona, mas no C# ta difícil amigo, não consigo chamar o método!

    quinta-feira, 12 de março de 2015 13:21
  • Ok... Eu entendi.. O seu erro 400 é devido, aparentemente um erro de formaçao do Json.

    Poderia postar aqui a parte onde ele é gerado?

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 12 de março de 2015 13:28
    Moderador
  • William,

    o testei seu código ele está reclamando do retorno que não é compatível neste trecho:

    HttpResponseMessage response = await client.GetAsync("api/oms/pvt/orders/v500280orgn-01/changes?an=organomix");

    Ta pedindo para retorna para o tipo Task.

    Outra coisa, em qual momento eu insiro meu Json? 

    O meu Json eu mesmo monto ele no meu código, quando eu testo no POSTMAN eu passo este mesmo Json na tela:

    {
      "reason": "Teste de Troca",
      "discountValue": 387,
      "itemsRemoved": [
        {
          "id": "2000889",
          "quantity": 1,
          "price": 591
       }
      ],
      "itemsAdded": [
        {
          "id": "106902",
          "quantity": 1,
          "price": 204
        }
      ]
    }

    E assim a alteração é feita!

    quinta-feira, 12 de março de 2015 13:43
  • Nao.. Definitivamente nao é um GET.. Eu nao interpretei direito o sua primeira mensagem. O que vc esta tentando fazer é enviar um json, entao neste caso é realmente um POST. No link que eu te enviei existe um exemplo de como fazer isso, mas creio que o problema seja como vc esta montando o JSON. Verifique com o aplicatio Fiddler se o json que vc esta enviando é examente igual ao que vc usa no postman.

    http://www.telerik.com/fiddler

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 12 de março de 2015 14:01
    Moderador
  • Sim, é o exato acima!

    Eu não encontro como passar este Json em código, poderia me ajudar?

    Abs

    quinta-feira, 12 de março de 2015 14:17
  • Bom vamos do começo novamente... O primeiro codigo que eu te enviei é para um GET. O que vc quer fazer é um POST, entao meu codigo NAO serve. 

    No link que eu te enviei existe um exemplo de POST, estou reproduzindo ele aqui:

    // HTTP POST
    var gizmo = new Product() { Name = "Gizmo", Price = 100, Category = "Widget" };
    response = await client.PostAsJsonAsync("api/products", gizmo);
    if (response.IsSuccessStatusCode)
    {
        // Get the URI of the created resource.
        Uri gizmoUrl = response.Headers.Location;
    }

    Note que a variavel gizmo é um instancia da classe que representa seu JSON.. Por isso eu pedi que postasse aqui o codigo que o esta gerando.

    Para criar uma classe a partir do JSON eu sugiro usar esta ferramenta:

    http://json2csharp.com/

    Voce cola um JSON valido e a pagina te cria a classe correspondente.

    No exemplo acima a classe é:

    class Product
    {
        public string Name { get; set; }
        public double Price { get; set; }
        public string Category { get; set; }
    }

    que com certeza NAO é o seu cenario.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------


    quinta-feira, 12 de março de 2015 15:23
    Moderador
  • Então vamos lá!

    Esta é a minha classe:

     public class NodeRest
        {
            public string reason { get; set; }
            public int discountValue { get; set; }

            public List<Itens> itemsRemoved { get; set; }

            protected List<Itens> ListaRemoved
            {
                set { this.itemsRemoved = value; }
                get { return this.itemsRemoved; }
            }

            public List<Itens> itemsAdded { get; set; }

            protected List<Itens> ListaAdd
            {
                set { this.itemsAdded = value; }
                get { return this.itemsAdded; }
            }
            public NodeRest()
            {

            }
            public NodeRest(string reason, int discountValue,List<Itens> listaRemovidos, List<Itens> listaAdd)
            {
                this.reason = reason;
                this.discountValue = discountValue;
                this.itemsRemoved = listaRemovidos;
                this.itemsAdded = listaAdd;
            }
        }

    Esta minha classe gerou este Json:

    {"reason":"Teste de Troca","discountValue":443,"itemsRemoved":[{"id":"106902","quantity":1,"price":185}],"itemsAdded":[{"id":"106902","quantity":1,"price":185}]}

    No Json2Charp do link que você me passou, o Json acima retornou a seguinte Classe:

    public class ItemsRemoved
    {
        public string id { get; set; }
        public int quantity { get; set; }
        public int price { get; set; }
    }
    
    public class ItemsAdded
    {
        public string id { get; set; }
        public int quantity { get; set; }
        public int price { get; set; }
    }
    
    public class RootObject
    {
        public string reason { get; set; }
        public int discountValue { get; set; }
        public List<ItemsRemoved> itemsRemoved { get; set; }
        public List<ItemsAdded> itemsAdded { get; set; }
    }

    Onde eu devo está errando?

    quinta-feira, 12 de março de 2015 16:30
  • Com relaçao a sua classe NodeRest e a classe que foi gerada, eu diria que a sua é mais elgante, com a excessao que vc tem propriedades que fazem referencias a propriedades. Por que existem essas duas propriedades: ListaRemoved e ListaAdd?

    Neste caso faça assim:

    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri("http://oms.vtexcommercestable.com.br/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
       // HTTP POST
    var modifProduto = new nodeRest();// crie uma instancia do seu objeto aqui e o preencha
    response = await client.PostAsJsonAsync("api/oms/pvt/orders/v500280orgn-01/changes?an=organomix", modifProduto );
    if (response.IsSuccessStatusCode)
    {
        // Get the URI of the created resource.
        Uri modifProdutoUrl = response.Headers.Location;
    }
    
    }
    Note que vc nao passa o JSON e sim o objeto. O metodo post vai serializar o objeto para voce.

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------




    sexta-feira, 13 de março de 2015 13:12
    Moderador
  • William,

    Deu BadRequest, seguinte, te passar mais informações:

    Este Rest me pedi autenticação, o Headers seria :

    X-VTEX-API-AppKey = meu email

    X-VTEX-API-AppToken = Senha

    Como eu colocaria isto no Headers?De acordo com o código acima?

    sexta-feira, 13 de março de 2015 15:42
  • Aqui vai um exemplo:

     var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", "[USERNAME]", "[PASSWORD]")));
        using (var httpClient = new HttpClient())
        {
            httpClient.DefaultRequestHeaders.Add("User-Agent", "MyApp [EMAIL ADDRESS]");
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials);
            var response = await httpClient.PostAsJsonAsync(
                "https://basecamp.com/[USER ID]/api/v1/projects.json",
                new {
                    name = "My Project",
                    description = "My Project Description"
                });
    
            var responseContent = await response.Content.ReadAsStringAsync();
            Console.WriteLine(responseContent);
        }

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    sexta-feira, 13 de março de 2015 17:15
    Moderador
  • William,

    desculpa, vou explicar melhor pra você, acredito que eu te passei são Headers que apenas são uma forma de "autenticação", a pergunta é, como eu deveria passar estes Headers ?

    X-VTEX-API-AppKey = meu email

    X-VTEX-API-AppToken = Senha

    sexta-feira, 13 de março de 2015 18:53
  • Deste jeito:

     httpClient.DefaultRequestHeaders.Add("X-VTEX-API-AppKey", "[EMAIL ADDRESS]");
    
     httpClient.DefaultRequestHeaders.Add("X-VTEX-API-AppToken", "[SENHA]");

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    sexta-feira, 13 de março de 2015 19:28
    Moderador
  • Quando coloco os Headers abaixo, me retorna BadRequest:

    HttpResponseMessage r = new HttpResponseMessage();
                HttpClient c = new HttpClient();
                c.BaseAddress = new Uri("http://oms.vtexcommercestable.com.br/");
                c.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

     c.DefaultRequestHeaders.Add("X-VTEX-API-AppKey", "email");
                c.DefaultRequestHeaders.Add("X-VTEX-API-AppToken", "senha");

       HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, "api/oms/pvt/orders/v500280orgn-01/changes?an=organomix");
                req.Content = new StringContent(json, Encoding.UTF8, "application/json");
                await c.SendAsync(req).ContinueWith(respTask =>
                {
                    r = respTask.Result;
                });
                HttpResponseMessage r2 = r;

    Mas quando eu retiro o código acima me retorna não autorizado, este não autorizado significa que esta chamando mas não tem autorização né?

    HttpResponseMessage r = new HttpResponseMessage();
                HttpClient c = new HttpClient();
                c.BaseAddress = new Uri("http://oms.vtexcommercestable.com.br/");
                c.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, "api/oms/pvt/orders/v500280orgn-01/changes?an=organomix");
                req.Content = new StringContent(json, Encoding.UTF8, "application/json");
                await c.SendAsync(req).ContinueWith(respTask =>
                {
                    r = respTask.Result;
                });
                HttpResponseMessage r2 = r;

    sexta-feira, 13 de março de 2015 19:59
  • Tem como testar com o fiddler e ver se realmente o header esta sendo enviado?

    O que eu interpreto. A autenticaçao que vc pos no header funcionou, mas existe um problema ainda com o json. Com o fiddler vc vai poder ver melhor. 

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------


    sexta-feira, 13 de março de 2015 20:03
    Moderador
  • Fui no RAW do Fiddler que vc me passou, me retornou isto nesta Aba RAW:

    POST http://oms.vtexcommercestable.com.br/api/oms/pvt/orders/v500280orgn-01/changes?an=organomix HTTP/1.1
    Accept: application/json
    X-VTEX-API-AppKey: email
    X-VTEX-API-AppToken: senha
    Content-Type: application/json; charset=utf-8
    Host: oms.vtexcommercestable.com.br
    Content-Length: 161
    Expect: 100-continue
    Connection: Keep-Alive

    {"reason":"Teste de Troca","discountValue":443,"itemsRemoved":[{"id":"106902","quantity":1,"price":185}],"itemsAdded":[{"id":"106902","quantity":1,"price":185}]}
    sexta-feira, 13 de março de 2015 20:48
  • Acredita!

    Este Fiddler me ajudou muito e eu pude ver a resposta do Web Service!

    Cara funcionou, quero te agradecer pela paciência que você teve comigo!

    Muito obrigado mesmo, Deus te abençoe !

    Vlw!

    sexta-feira, 13 de março de 2015 21:12
  • É sempre um prazer poder ajudar.

    Mas como a gente diz: "Eu podia estar matando, eu podia estar roubando, mas nao, estou aqui só pedindo que vc marque a resposta que mais te ajudou como a correta" :P

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    segunda-feira, 16 de março de 2015 12:54
    Moderador
  • Alguém aqui conseguiu integrar com a Vtex?
    terça-feira, 19 de março de 2019 00:18