Blog SAPienteSAPiente
OData

Como testar uma API OData standard no SAP

SAPiente3 de jul. de 2026· 15 min read

Ativei o serviço. Como testo de verdade?

No post anterior de como ativar a API no ambiente, a gente parou no status 200: serviço registrado, nó ICF verde, Gateway respondendo. Só que 200 diz só uma coisa — a API está no ar. Não diz quais campos ela devolve, como filtrar, como navegar do cabeçalho para os itens, nem como criar um registro. É isso que vamos fazer aqui, tela por tela, usando a Sales Order (A2X) como exemplo. Primeiro dentro do próprio SAP, no SAP Gateway Client, e depois no Postman.

Escrevi pensando no funcional que quer validar um serviço standard sem depender do dev. Mas o caminho é o mesmo para qualquer um. Se você ainda não ativou o serviço, comece pelo guia Como ativar uma API OData V2 standard no SAP e volte aqui.

Rápido, só para nivelar. Uma API é a porta por onde dois sistemas trocam dados sem ninguém digitar tela. OData é o padrão que a SAP usa nessas portas. E testar a API é bater nessa porta e conferir o que volta. Tudo aqui é feito sem escrever código.

Para acompanhar: acesso ao SAP Business Accelerator Hub (gratuito), à transação /IWFND/GW_CLIENT no seu sistema e ao Postman. O Gateway Client deste guia roda em On-Premise / S/4HANA Private Cloud. O Postman serve para qualquer ambiente que exponha a API por HTTPS.

Parte 1: conhecer a API no Business Accelerator Hub

Antes de mandar a primeira chamada, vale abrir a página da API no Hub e passar pelas abas. É lá que você descobre o que a API faz, como ela autentica e quais campos ela tem. Cinco minutos aqui economizam meia tarde de tentativa e erro depois.

Página da Sales Order A2X no SAP Business Accelerator Hub, aba Overview, mostrando Attributes com o cenário de comunicação SAP_COM_0109 e os scope items

Aba Overview → Attributes: o cenário de comunicação (SAP_COM_0109) e os scope items que entregam a API.

A primeira aba já entrega muita coisa para o funcional: qual cenário de comunicação libera a API e quais scope items ela cobre. Se o processo do cliente não tem aquele scope item ativo, nem adianta seguir.

Aba de métodos de autenticação da API mostrando Basic Authentication, OAuth 2.0 Authorization Code e X.509

Authentication Methods: Basic Auth, OAuth 2.0 e X.509. São os modos que a API aceita para te autenticar.

Aba Extensibility da API indicando se a API pode ser estendida com campos custom

Extensibility: se a API aceita campos de extensão (custom fields), aparece aqui.

Aba Schema View listando os schemas da Sales Order A2X: Sales Order Header, Header Billing Plan, Header Partner e variações for create e for update

Schema View: o modelo de dados. Cada entidade e suas variações (leitura, for create, for update).

Aba API Consumption mostrando opções de linguagem Java, JavaScript e ABAP e os passos de geração de proxies

API Consumption: snippets por linguagem e os passos para consumir a API no seu código.

Aba API Consumption selecionada em ABAP, explicando a geração do Service Consumption Model SRVC no ADT

A mesma aba em ABAP: como gerar o Service Consumption Model (SRVC) no ADT. Útil para quando o teste virar desenvolvimento.

Página do SAP Help Portal para Sales Order A2X OData V2 mostrando a estrutura do serviço e a tabela de service entities

SAP Help Portal: a estrutura do serviço e a tabela de entities, cada uma com link para os detalhes.

A aba API Reference: o catálogo de operações

Essa é a aba que você mais vai usar enquanto testa. Ela lista todas as operações da API, agrupadas por entidade, com o verbo HTTP colorido na frente: GET para ler, POST para criar, PATCH/PUT para alterar, DELETE para apagar.

Aba API Reference da Sales Order A2X com a lista completa de operações por entidade e os verbos GET, POST, PATCH e DELETE coloridos

Aba API Reference: cada entidade e suas operações, com o verbo colorido.

O que cada operação faz (sem decoreba)

Repare nas cores dos verbos na imagem acima. Cada cor é uma ação diferente, e o nome assusta mais do que o conceito. Pensa num pedido de venda e fica fácil:

Verbo

O que faz

No pedido de venda

GET

Lê / consulta. Não altera nada.

Abrir um pedido só para ver os dados

POST

Cria um registro novo.

Criar um pedido de venda do zero

PUT

Substitui o registro inteiro.

Regravar o pedido todo, de uma vez

PATCH

Altera só alguns campos.

Mudar só a quantidade de um item

DELETE

Apaga o registro.

Eliminar um pedido

Batch

Junta várias chamadas numa só.

Criar o cabeçalho e os itens no mesmo pacote

O jeito mais fácil de lembrar: GET é o único que não mexe em nada, por isso é o teste mais seguro para começar. POST, PUT, PATCH e DELETE todos alteram dado, e é por isso que eles vão pedir um token de segurança lá na frente. Na mesma fileira você ainda vê MERGE e HEAD: o MERGE é o "primo antigo" do PATCH no OData V2, e o HEAD é um GET que só confere se a porta responde, sem trazer o conteúdo.

O Batch (aquele item Batch Requests no fim da lista) ele serve para mandar várias operações numa chamada só, em vez de uma de cada vez. É o que você usa quando uma depende da outra: criar o cabeçalho do pedido e já gravar os itens juntos, num pacote "tudo ou nada". Se uma parte falha, nada é gravado. Para o funcional, basta saber que ele existe e para que serve.

Detalhe de uma operação GET na API Reference mostrando a tabela de opções de query: filter, select, expand, top, skip, orderby, inlinecount

Abrindo uma leitura (GET): a tabela de opções de query que a API aceita ($filter, $select, $expand, $top...), cada uma com link para a doc.

Guarde essas opções de query, porque são elas que transformam um GET cru numa consulta útil. $top limita a quantidade, $filter restringe por campo, $select escolhe só os campos que interessam e $expand traz os dados relacionados junto (os itens de um pedido, por exemplo). Pensa num balcão: "me traz só os 50 primeiros ($top), só os pedidos do cliente X ($filter) e só os campos data e valor ($select)". É exatamente isso, só que escrito na URL.

Operação POST para criar um pedido na API Reference, com a seção de parâmetros e o corpo de exemplo em JSON

Operação POST (criar pedido): parâmetros e corpo de exemplo, prontos para copiar ao selecionar no Example Value.

Seletor de exemplo por entidade aberto na operação POST, listando Sales Order, Sales Order Item, Sales Order Partner e outras

O mesmo POST com o Schema aberto que vai te dizer as propriedades de cada campo. É daqui que você tira a estrutura do JSON para criar um registro.

Dá para escolher o exemplo por entidade: cabeçalho, item, partner, billing plan...

Referência da leitura por chave: operação GET A_SalesOrder com a chave do pedido como parâmetro

Leitura por chave: A_SalesOrder('<número>') devolve um pedido só, em vez da lista inteira.

Parte 2: testar no backend com o SAP Gateway Client

Aqui está a forma mais rápida de testar uma API OData dentro do SAP. O Gateway Client (transação /N/IWFND/GW_CLIENT) ou você pode ir pela /N/IWFND/MAINT_SERVICE, procurar pelo serviço e clicar em testar, já roda com o seu usuário logado, então você não precisa montar autenticação nenhuma para começar. É o lugar certo para o primeiro teste.

SAP Gateway Client com o método GET selecionado e a Request URI preenchida com o caminho do serviço API_SALES_ORDER_SRV e o parâmetro format xml

A Request URI já vem montada com o nome externo do serviço. Método GET e ?$format=xml para começar.

Aquela fileira no topo (GET, POST, PUT, PATCH, MERGE, DELETE, HEAD) são os mesmos verbos da tabela lá de cima, agora em forma de botão. Para testar leitura, deixe marcado o GET. O $format=xml devolve o service document, a "capa" do serviço com a lista de collections. Para ler dados de verdade, troque por $format=json, que é bem mais fácil de ler. Mas antes de digitar a entidade na mão, deixe o sistema listar para você.

Botão Entity Set do Gateway Client aberto, mostrando o popup com as 22 collections do serviço: A_SalesOrder, A_SalesOrderItem, A_SalesOrderHeaderPartner e outras

Botão Entity Set: o sistema lista as 22 collections do serviço (A_SalesOrder, A_SalesOrderItem...). Escolha uma e a URI se completa sozinha.

Antes de seguir, dois nomes que vão se repetir. Cada item dessa lista (A_SalesOrder, A_SalesOrderItem...) é uma entity: um tipo de registro. A A_SalesOrder é o cabeçalho do pedido (cliente, data, valor total); a A_SalesOrderItem são os itens (produto, quantidade). A lista inteira de uma entity é a collection, ou seja, a "tabela" daquele tipo. Escolhi a A_SalesOrder, troquei para JSON e cliquei em Execute.

Execute → status 200. A resposta traz o array de pedidos em JSON. Repare no Processing Time no topo.

Status 200 e corpo preenchido: a API está entregando dado. Agora o pulo é saber ler essa resposta. Dentro de cada registro existe um bloco __metadata com um campo uri.

Aqui no exemplo abaixo o $top=50 vai trazer os 50 primeiros registros e o $format=json muda o formato da resposta para JSON para facilitar a leitura

Resposta JSON do Gateway Client com uma seta destacando o bloco __metadata e o campo uri de um registro

Uma observação importante é que se você der um GET em uma entidade que pode trazer muitos registros como a do exemplo que é Ordens de Venda, é importante limitar a quantidade de busca com o $top para não dar timeout, pois ele irá trazer todas as SO do ambiente.

O bloco __metadata.uri de cada registro: é a URL exata daquele pedido.

Gateway Client lendo um único registro de pedido em JSON, com tempo de processamento baixo

Colando aquela uri (ou a chave) você lê um pedido só e confere campo a campo.

Outra leitura no Gateway Client retornando status 200 com o registro solicitado em JSON

Mais uma leitura, status 200, com o registro pedido. É assim que você valida se o campo X existe e vem preenchido.

Navegação no Gateway Client: Request URI A_SalesOrder com chave 3 seguida de to_Item, retornando os itens daquele pedido

Navegação: A_SalesOrder('3')/to_Item devolve os itens daquele cabeçalho. É a associação "andando" pela URL.

Essa navegação é o coração do OData. Em vez de buscar pedido e itens em duas chamadas, você anda da entidade pai para a filha pela própria URL (/to_Item), ou traz tudo de uma vez com $expand=to_Item. Para o funcional, é o que confirma se o relacionamento que ele precisa já vem pronto no standard.

Até aqui, tudo foi leitura. E leitura é livre. O bicho pega quando você tenta gravar.

Tentativa de POST no Gateway Client retornando status 400 Bad Request com mensagem de erro relacionada a token CSRF

POST com o body com campos inválidos: status 400(sempre que for códigos 4xx é erro no payload que está enviando), ou seja, quando você for testar criação muito provalvemente se você não tiver os dados de criação 100%, sempre voltará uma mensagem de erro indicando o que está errado, semelhante as BAPIs.

Parte 3: montar e testar a collection no Postman

O Gateway Client é ótimo para o teste rápido dentro do SAP. Mas quando você quer simular o que um sistema externo enxerga, guardar as chamadas, compartilhar com o time ou alternar entre DEV, QA e PRD, o Postman é a ferramenta. E o melhor: você não monta nada do zero. O próprio Hub te dá a collection pronta.

Postman no workspace pessoal com o menu de três pontos aberto mostrando a opção Import

No Postman: workspace → ...Import.

Diálogo do Postman Choose how to import your Specification com as opções Postman Collection Sales Order A2X e OpenAPI 3.0

Importando a collection Sales Order (A2X) baixada do Hub. Pode ser como Postman Collection ou OpenAPI 3.0.

Collection Sales Order A2X importada no Postman, com a pasta A_SalesOrder e as demais entidades na barra lateral

Collection importada: cada entidade vira uma pasta e cada operação já vem como request pronto.

Um aviso de nomes: no Postman, collection quer dizer "pasta de chamadas salvas". Não é a mesma collection do OData (a lista de registros). Mesma palavra, coisas diferentes.

Request Reads all sales order headers aberto no Postman, do tipo GET

Abrindo o request "Reads all sales order headers" (GET). Não precisei escrever a URL.

Postman mostrando a URL com a variável baseUrl resolvendo para o caminho do serviço e a tabela de Query Params com top, skip, filter, orderby, select, expand, format

A URL usa a variável {{baseUrl}}, que resolve para o caminho do serviço. Embaixo, as query options já documentadas ($top, $filter, $select, $expand...).

Repare que são as mesmas opções que vimos na API Reference e usamos no Gateway Client. OData é OData, muda só a ferramenta. Aqui você marca o $top=50 para não puxar a base inteira e o $format=json para a resposta vir legível.

Aba Authorization da collection no Postman configurada como Basic Auth, com campos de Username e Password

Authorization da collection = Basic Auth: usuário e senha valem para todas as requests de uma vez.

Configurar a autenticação na collection, e não em cada request, é o atalho que poupa tempo. Toda chamada herda o Basic Auth. Foi exatamente a autenticação que o Hub indicou lá na aba Authentication Methods.

Request GET executado no Postman retornando status 200 e o corpo JSON na aba de resposta

Send → 200 com o JSON na resposta. Mesmo resultado do Gateway Client, agora visto de fora.

Variáveis e ambientes: testar DEV, QA e PRD sem reescrever nada

Essa é a parte que mais ajuda no dia a dia. Em vez de colar a URL do sistema em cada request, você usa uma variável e deixa o ambiente decidir o valor. Trocou o ambiente, trocou o destino, e a request continua igual.

Aviso No Environments no Postman com o botão Create Environment

Sem ambiente ainda: Create Environment.

Ambiente DEV criado no Postman com a variável Base_URL apontando para https://teste1

Ambiente DEV com a variável Base_URL apontando para o sistema de desenvolvimento.

Ambiente QAS criado no Postman com a variável Base_URL apontando para https://teste2

Ambiente QAS com a mesma Base_URL, mas apontando para o sistema de QA.

Os valores https://teste1 e https://teste2 são só de exemplo, para mostrar o mecanismo. Na vida real você coloca aqui a URL de cada sistema (a base do serviço, antes do /A_SalesOrder).

Lista de ambientes DEV e QAS no Postman com a opção Set active em destaque

Lista de ambientes: Set active escolhe onde a request vai rodar.

Postman trocando o ambiente ativo pelo seletor no canto superior direito, entre DEV e QAS

Trocando o ambiente ativo pelo seletor no canto. A request usa {{Base_URL}} e não muda.

Tooltip do Postman mostrando que com o ambiente DEV ativo a variável Base_URL resolve para https://teste1

Com DEV ativo, {{Base_URL}} resolve para o valor de desenvolvimento.

Postman com o ambiente QAS marcado como ativo no seletor

Mudando o ativo para QAS...

Tooltip do Postman mostrando que com QAS ativo a variável Base_URL agora resolve para https://teste2

...e o mesmo {{Base_URL}} agora resolve para o valor de QA. A request é idêntica, só o ambiente mudou.

Exportar a collection para levar com você

Por último, vale guardar o que você montou. A collection exportada é um arquivo que você versiona no Git, manda para um colega ou importa em outro workspace.

Menu da collection no Postman com More e a opção Export collection em destaque

Collection → ... → More → Export collection.

Diálogo Export collection do Postman com o botão Export JSON destacado

Export JSON: a collection vira um arquivo, pronto para compartilhar na sua EF ou versionar.

Por que isso importa para o funcional

Testar uma API não é "coisa de dev". Quando você mesmo abre o Gateway Client e dá um GET, descobre na hora se o standard já entrega aquele campo, aquele filtro, aquela navegação. Aí a conversa com o desenvolvedor muda: em vez de abrir um GAP no escuro, você chega dizendo "a API standard cobre isso aqui, falta só aquilo". Menos retrabalho dos dois lados.

Pegue o hábito de testar nos dois lugares. O Gateway Client responde a pergunta "a API funciona no meu sistema?". O Postman responde "como um consumidor externo enxerga isso, em DEV, QA e PRD?". Juntos, eles cobrem quase todo cenário de teste antes de uma linha de código entrar no projeto.

Perguntas frequentes

Preciso ativar o serviço antes de testar?

Sim. O teste só funciona se o serviço estiver registrado e com o nó ICF ativo. Esse é o tema do guia Como ativar uma API OData V2 standard no SAP . Com o serviço no ar e o 200 aparecendo, você está pronto para tudo que está neste post.

Qual a diferença entre testar no Gateway Client e no Postman?

O Gateway Client roda dentro do SAP, com o seu usuário já logado: é o teste mais rápido para confirmar que a API responde. O Postman é um cliente externo, então você precisa montar a autenticação e a URL completa. Em compensação, ele guarda as chamadas, alterna entre ambientes e é fácil de compartilhar.

Por que vale a pena usar variáveis e ambientes no Postman?

Porque você testa o mesmo serviço em DEV, QA e PRD sem reescrever a request. A URL de cada sistema fica numa variável (Base_URL) dentro de cada ambiente. Troca o ambiente ativo e pronto, a chamada inteira aponta para o sistema certo. Também evita deixar host e senha "chumbados" na request.

Por que meu POST volta com erro mesmo com o serviço ativo?

Quase sempre é o token CSRF. Leitura (GET) é liberada, mas criar, alterar ou apagar exige primeiro buscar o token com um GET usando o header X-CSRF-Token: Fetch e depois mandá-lo na chamada de gravação. Sem o token, o Gateway recusa com erro (403 ou 400).

Esse fluxo serve para OData V4 também?

O conceito é o mesmo: entender a entidade, ler, filtrar, navegar e gravar. O que muda é o caminho da URL e alguns detalhes de protocolo. As query options ($filter, $select, $expand) seguem valendo, e o Postman funciona igual, bastando trocar a base do serviço.

Conclusão

Testar uma API standard é uma sequência simples quando você separa por ferramenta. No Hub você entende a API: entities, autenticação e opções de query. No Gateway Client você confirma, dentro do SAP, que ela lê, filtra e navega. No Postman você reproduz isso de fora, com a collection pronta, autenticação na collection e ambientes para DEV, QA e PRD.

O detalhe que mais derruba gente é o CSRF na hora de gravar, então guarde esse. Fora isso, o procedimento é o mesmo para qualquer API OData standard, muda só o nome do serviço. Quanto mais natural ficar esse caminho, mais cedo você valida se o standard resolve, e menos tempo perde travado em "será que a API faz isso?".

Referências oficiais

TagsAPI StandartClean CoreFuncionalDesenvolvedorHANAPerformace
Avalie este conteúdo
para avaliar
SAPiente
@sapiente

Blog sobre SAP, ABAP, BTP, Fiori e tudo que envolve o ecossistema SAP.

Ver perfil →
FacebookInstagramYouTubeTwitter

Comentários 0

Entre na conversa

Faça login para deixar seu comentário neste artigo.

Ainda sem comentários

Seja o primeiro a comentar este artigo.