Technical Articles
Gateway – OData Post using Postman
Hello,
In this blog i’m gonna demonstrate how to use Postman to execute Post calls to a SAP Gateway server.
First, download Postman from here: https://www.getpostman.com/downloads/
Then, create the Z table below in your backend(assuming it’s a Hub scenario) server:
After that, create both RFC enabled Functional Modules:
function zdemo_gw_post.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(IM_POST) TYPE ZPOST1 OPTIONAL
*"----------------------------------------------------------------------
"Just get it in there...
modify zpost1 from im_post.
commit work.
endfunction.
function zdemo_gw_post_read.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(IM_FIELD1) TYPE CHAR10 OPTIONAL
*" EXPORTING
*" VALUE(EX_POST) TYPE ZPOST1
*"----------------------------------------------------------------------
select single *
from zpost1
into ex_post
where field1 = im_field1.
endfunction.
Now setup your ZDEMO_POST Gateway project (SEGW) like this:
Your Object Entity (ref from the Z table) with same Key field:
Create implementation:
Read implementation:
Setup your Service to your backend Alias:
After that you’re all set on the Gateway/ABAP side.
Now let’s open Postman:
Create a Request (saving in a Collection, to group calls):
Before you execute a POST call, you need to have a csrf token (you can find more info about it here: https://help.sap.com/saphelp_gateway20sp12/helpdata/en/e6/cae27d5e8d4996add4067280c8714e/frameset.htm
To get it, you need to execute a GET call fetching the token, so let’s do it:
Execute a GET call (please change the SERVER:PORT to your gateway’s server and port ?), you could just get the metadata with the following URL: SERVER:PORT/sap/opu/odata/sap/ZDEMO_POST_SRV/$metadata
In the Authorization tab, select Basic Auth and enter your Gateways user/password:
Hit Send, and the metadata returns with success:
So it’s communicating ?, now to get the Token, in the Headers Tab, add a entry with x-csrf-token = Fetch, like below:
After executing the service, note that the token gets returned in the Headers Tab.
Now we’re all set to execute the POST call, so we change it like below:
SERVER:PORT/sap/opu/odata/sap/ZDEMO_POST_SRV/ObjectSet
Change the Token to the value returned:
In the Body section, insert this XML (change to the values that you want to be inserted in each XML Field):
<?xml version="1.0" encoding="utf-8"?>
<entry xml:base="/sap/opu/odata/sap/ZDEMO_POST_SRV/" xmlns="http://www.w3.org/2005/Atom" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
<title type="text">ObjectSet</title>
<updated>2019-07-18T17:50:32Z</updated>
<category term="ZDEMO_POST_SRV.Object" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
<link href="ObjectSet" rel="self" title="Object"/>
<content type="application/xml">
<m:properties>
<d:Field1>WIKI</d:Field1>
<d:Field2>FIELD2</d:Field2>
<d:Field3>FIELD3</d:Field3>
</m:properties>
</content>
</entry>
Send, if everything is correct, 201 status is returned:
The data inserted in the Z table:
Enjoy. ???
Regards.
Hi Jose,
Its a nice post. I have tried and worked. I am trying for a deep entity ( Header and Item) but something i am missing. Could you please share the XML for that scenario?
Hello Rajesh,
Have you redefined the create_deep_entity method on the Gateway server?
Testing on the Gateway Client works?
Regards.
Hi Jose,
Quick tip -> you can use Postman variables to store the x-csrf token: https://learning.getpostman.com/docs/postman/environments_and_globals/variables/
Cheers,
Pierre
Hello Pierre,
That is correct, i was trying to be as simple/basic as possible, but thanks for input. The variables functionality is very useful for us Postman fanatics.
Thanks.
Hello Jose.
Thanks you for the guide!
Very helpful!
I have questions about JASON format.
or It's possible only XML ?
2. Want to know that several lines post sample
Thank you.
EJ.
Hello,
Yes, you can post a JSON payload and also get JSON payload on your get calls, by using at the end: ?$format=json
Thanks.