Quantcast
Channel: SCN : All Content - SAP Gateway
Viewing all articles
Browse latest Browse all 2823

Testing OData $batch Processing with Content ID in SAP Gateway

$
0
0

cid_150.png

This page is for explaining how to test the OData $batch services with Content ID, which is implemented in the H2G.


In this H2G, we're going through the steps of testing OData $batch services with Content ID by REST Client.


In the test steps, we'll create a $batch request that contains one parent entity with Content ID $100, and two children.

b_batch_payload.png

Two testing tools are explained:

 

SAP Gateway Client


In the SAP tx SEGW, find your Gateway project and select "Service Maintenance" > "Your GW System" > "SAP Gateway Client".

t1.png

In a SAP Gateway Client tool, enter following request information:


Note: SAP Gateway Client handles all the authentication info such as X-CSRF-Token or Basic Auth behind the scenes.


  • HTTP Method = POST
  • Request URI = the URL has $batch suffix
  • Content-Type = multipart/mixed;boundary=batch_mybatch
  • Payload body = enter the batch script

t2.png

And execute it - confirm the successful response.

t3.png

 

 

POSTMAN REST client


Start a POSTMAN REST client. Type the URL of your OData service document URL (the URL that ends with "_SRV/"). Set following params:

 

  • HTTP GET
  • Content-Type = multipart/mixed;boundary=batch_mybatch
  • X-CSRF-Token = Fetch
  • Authentication - (basic auth credentials)

c_1.png

Execute the request by pressing "Send". You should be able to obtain the returned x-csrf-token value. Copy it - this is required to execute HTTP POST later.

c_2.png

Paste the token value for X-CSRF-Token param in the header. Set following params:


  • HTTP POST - the URL has $batch suffix
  • Content-Type = multipart/mixed;boundary=batch_mybatch
  • X-CSRF-Token = <token>
  • Authentication - (basic auth credentials)

 

c_3.png

Now your POSTMAN is fully ready for sending the $batch payload. Click on "Body" and select raw.

c_0.png

Here you'll enter the payload. (Explanation follows)

 

01 --batch_mybatch
02 Content-Type: multipart/mixed; boundary=changeset_mychangeset1
03
04 --changeset_mychangeset1
05 Content-Type: application/http
06 Content-Transfer-Encoding: binary
07
08 POST HeaderSet HTTP/1.1
09 Content-Type: application/xml
10 Content-Length: 1021
11 Content-ID: 100
12
13 <?xml version="1.0" encoding="utf-8"?>
14 <entry xml:base="http://..._SRV/"
15     xmlns="http://www.w3.org/2005/Atom"
16     xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
17     xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
18     <content type="application/xml">
19         <m:properties>
20             <d:Id>1</d:Id>
21             <d:Text>New parent entity</d:Text>
22         </m:properties>
23     </content>
24 </entry> 
25
26 --changeset_mychangeset1
27 Content-Type: application/http
28 Content-Transfer-Encoding: binary
29
30 POST $100/ToItems HTTP/1.1
31 Content-Type: application/xml
32 Content-Length: 1021
33
34 <?xml version="1.0" encoding="utf-8"?>
35 <entry xml:base="http://..._SRV/"
36     xmlns="http://www.w3.org/2005/Atom"
37     xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
38     xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
39     <content type="application/xml">
40         <m:properties>
41             <d:ParentId></d:ParentId>
42             <d:Id>000010</d:Id>
43             <d:Text>First child entity</d:Text>
44         </m:properties>
45     </content>
46 </entry>
47
48 --changeset_mychangeset1
49 Content-Type: application/http
50 Content-Transfer-Encoding: binary
51
52 POST $100/ToItems HTTP/1.1
53 Content-Type: application/xml
54 Content-Length: 1021
55
56 <?xml version="1.0" encoding="utf-8"?>
57 <entry xml:base="http://..._SRV/"
58     xmlns="http://www.w3.org/2005/Atom"
59     xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
60     xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
61     <content type="application/xml">
62         <m:properties>
63             <d:ParentId></d:ParentId>
64             <d:Id>000020</d:Id>
65             <d:Text>Second child entity</d:Text>
66         </m:properties>
67     </content>
68 </entry>
69
70 --changeset_mychangeset1--
71 
72 --batch_mybatch--

#01 - The beginning of the $batch request. It has to start with "--" with the batch name, which is the same name you defined in the header of Content-Type = multipart/mixed;boundary=batch_mybatch.

#02 - Content type definition of the changeset.

#03 - This line space is very important. At least one "carriage return line feed" is required.

#04 - The beginning of the changeset. It has to start with "--" with the changeset name, which is the same name you defined in the line #02.

#05/06 - Conventional value for Content-Type and Content-Transfer-Encoding.

#07 - At least one "carriage return line feed" is required.

#08/09 - POST request for HeaderSet entity.

#10 - Content-Length value must be equal to or greater than the real length of the data below.

#11 - A line of the Content ID value.

#12 - At least one "carriage return line feed" is required.

#13 to 24 - The HeaderSet payload. You can obtain this payload format via Read operation. If you obtain the payload via Read, that should contain the tags like <id/>, <title/>, <updated/>, <category/>, and <link/>. You can keep them in this $batch payload or just discard them - the OData services simply ignore them.

#25 - At least one "carriage return line feed" is required.

#26 - As the next entity is a part of the same changeset, it has the same value with the line #04.

#27 to 29 - Same rule follows in the ItemSet.

#30 - POST request for ItemSet entity. As you see, the Content ID is being used.

#31 to 33 - Same rule follows in the ItemSet.

#34 to 46 - The ItemSet payload. Just like you did for HeaderSet entity, you can obtain this payload format via Read operation. Please note this payload has the empty value for <parentID> tag. During OData $batch processing, this value will be handled correctly via the Content ID value.

#47 to 69 - The second HeaderItem POST request.

#70 - The closing of the changeset. It has to start with "--" with the changeset name AND closing "--" characters.

#71 - At least one "carriage return line feed" is required.

#72 - The closing of the batch request. It has to start with "--" with the batch name AND closing "--" characters.

 

Let's execute the $batch request by pressing Send button. If the $batch processing is done correctly, you should be able to see "201 Created" responses for each entity in the returned payload body.


Note: As written, the line spacing is critical (it is a part of the standard OData specification).

c_8.png

Time to experiment further... try set the remote breakpoint in the ABAP editor - and see how the changeset_begin, changeset_process, and changeset_end are called sequentially.

cid_circle_75.png


Viewing all articles
Browse latest Browse all 2823

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>