V001 /copy qcpysrc,h#ilenact2 V001 // Must bind in QSYSDIR/QAXIS10CC V001 /COPY /QIBM/ProdData/OS/WebServices/V1/client/include/Axis.rpgleinc V001 V001 DCL-PR Program extpgm('PROGRAM'); V001 piSERVICE LIKE(OTHTOK_T.SVCNAME); V001 END-PR; V001 V001 DCL-PI Program; V001 piSERVICE LIKE(OTHTOK_T.SVCNAME); V001 END-PI; V001 V001 //////////////////// V001 DCL-S HTTPStatus CHAR(3); V001 DCL-S ErrorMsg CHAR(32768); V001 DCL-S tHandle POINTER; V001 DCL-S rxCode INT(10); V001 DCL-S rxSize INT(10); V001 DCL-s DIDataOpts CHAR(100); V001 DCL-S request CHAR(32768); V001 DCL-S propBuf CHAR(100); V001 DCL-S propBuf2 CHAR(600); V001 DCL-S method CHAR(7) ; V001 DCL-S uri CHAR(200); V001 DCL-C C_CERTSTORE CONST('/QIBM/USERDATA/ICSS/CERT/SERVER/DEFAULT.KDB'); V001 DCL-S CertStorePointer POINTER ; V001 // V001 DCL-C C_NONE CONST('None'); V001 DCL-S NonePointer POINTER ; V001 DCL-C C_BLANK CONST(''); V001 DCL-S BlankPointer POINTER ; V001 DCL-C C_TRUE CONST('true'); V001 DCL-S TruePointer POINTER ; V001 V001 DCL-DS RxDataDS QUALIFIED; V001 rxdata CHAR(32768); V001 responseSize LIKE(rxSize); V001 outStatus LIKE(HTTPStatus); V001 outErrorMsg CHAR(32768); V001 End-Ds; V001 V001 DCL-DS CheckErrorDS QUALIFIED; V001 outStatus LIKE(HTTPStatus); V001 outErrorMsg LIKE(ErrorMsg); V001 End-Ds; V001 V001 //////////////////// V001 V001 DCL-S Token LIKE(OTHTOK_T.TOKEN); V001 DCL-S TabCharacter CHAR(1) INZ(X'09'); V001 DCL-S CarriageReturn CHAR(1) INZ(X'0D'); V001 DCL-S LineFeed CHAR(1) INZ(X'0A'); V001 DCL-S NULLSTR CHAR(1) inz(X'00'); V001 // V001 DCL-DS returnedData QUALIFIED; V001 planmatch_normalised IND; V001 itemsFailed INT(20); V001 itemsImported INT(20); V001 state CHAR(16); V001 href VARCHAR(32740); V001 createdAt CHAR(24); V001 createdBy LIKEDS(createdByDS); V001 planmatch_includeportalreference IND; V001 id INT(20); V001 tenant LIKEDS(tenantds); V001 productProvider LIKEDS(productProviderds); V001 END-DS ; V001 // V001 DCL-DS createdByDS QUALIFIED; V001 href VARCHAR(32740); V001 id INT(10); V001 name VARCHAR(32740); V001 END-DS ; V001 V001 DCL-DS tenantds QUALIFIED; V001 href VARCHAR(32740); V001 id INT(10); V001 END-DS ; V001 V001 DCL-DS productProviderds QUALIFIED; V001 href VARCHAR(32740); V001 id INT(10); V001 name VARCHAR(32740); V001 END-DS ; V001 V001 V001 Token = 'xxx'; V001 V001 // -------------------------------------------------------------------- V001 // Web service logic. The code will attempt to invoke a Web service. V001 // -------------------------------------------------------------------- V001 // Enable trace V001 axiscaxisstarttrace('/tmp/OAUTHTokenReq.log': *NULL); V001 V001 // Set URI V001 method = 'POST'; V001 uri = %trim('https://api.xxx.com/'); V001 V001 // Create HTTP transport handle. V001 tHandle = axiscTransportCreate(uri:AXISC_PROTOCOL_HTTP11); V001 if (tHandle = *NULL); V001 ErrorMsg = 'TransportCreate() failed'; V001 return; V001 endif; V001 V001 // Set Auth Header V001 propBuf = 'Authorization' + NULLSTR; V001 propBuf2 = %TRIM(Token) + NULLSTR; V001 rxCode = axiscTransportSetProperty(tHandle: V001 AXISC_PROPERTY_HTTP_HEADER: V001 %addr(propBuf): V001 %addr(propBuf2)); V001 V001 // Set Api Key V001 propBuf = 'x-api-key' + NULLSTR; V001 propBuf2 = %TRIM('xxx') V001 + NULLSTR; V001 rxCode = axiscTransportSetProperty(tHandle: V001 AXISC_PROPERTY_HTTP_HEADER: V001 %addr(propBuf): V001 %addr(propBuf2)); V001 V001 // Set content encoding V001 propBuf = 'Content-Type' + NULLSTR; V001 propBuf2 = 'text/tab-separated-values' + NULLSTR; V001 rxCode = axiscTransportSetProperty(tHandle: V001 AXISC_PROPERTY_HTTP_HEADER: V001 %addr(propBuf): V001 %addr(propBuf2)); V001 V001 V001 V001 // Turn on SSL. V001 V001 CertStorePointer = %alloc(%len(%TRIM(C_CERTSTORE))+1); V001 %str(CertStorePointer: %len(%TRIM(C_CERTSTORE))+1) = C_CERTSTORE; V001 V001 NonePointer = %alloc(%len(%TRIM(C_NONE))+1); V001 %str(NonePointer: %len(%TRIM(C_NONE))+1) = C_NONE; V001 V001 BlankPointer = %alloc(%len(%TRIM(C_BLANK))+1); V001 %str(BlankPointer: %len(%TRIM(C_BLANK))+1) = C_BLANK; V001 TruePointer = %alloc(%len(%TRIM(C_TRUE))+1); V001 %str(TruePointer: %len(%TRIM(C_TRUE))+1) = C_TRUE; V001 rxCode = axiscTransportSetProperty(tHandle: V001 AXISC_PROPERTY_HTTP_SSL: V001 CertStorePointer: // cert store BlankPointer : // store pwd BlankPointer : // cert label NonePointer : // SSL V2 NonePointer : // SSL V3 NonePointer : // TLS V1 NonePointer : // TLS V1.1 BlankPointer : // TLS V1.2 TruePointer : // Tolerate soft warnings BlankPointer : // App ID BlankPointer : // SNI V001 *NULL); V001 V001 propBuf = %TRIM(method) + NULLSTR; V001 rxCode = axiscTransportSetProperty(tHandle: V001 AXISC_PROPERTY_HTTP_METHOD: %addr(propBuf)); V001 V001 // Build request body V001 clear request; V001 request = 'xxx' V001 request = %TRIM(request) + TabCharacter; V001 request = %TRIM(request) + CarriageReturn; V001 request = %TRIM(request) + LineFeed; V001 V001 request = 'xxx'; V001 request = %TRIM(request) + TabCharacter; V001 request = %TRIM(request) + CarriageReturn; V001 request = %TRIM(request) + LineFeed; V001 V001 rxCode = axiscTransportSend(tHandle: V001 %addr(request): V001 %len(%trim(request)): V001 0); V001 V001 if (rxCode = -1); V001 CheckErrorDS = checkError(tHandle:'TransportSend()'); V001 RxDataDS.outStatus = CheckErrorDS.outStatus; V001 RxDataDS.outErrorMsg = CheckErrorDS.outErrorMsg; V001 else; V001 RxDataDS = ReceiveData(tHandle); V001 endif; V001 V001 if RxDataDS.outStatus = '201'; V001 DIDataOpts = 'case=any countprefix=num allowextra=yes'; V001 // DIParserOpts = 'diagMessages=yes boolean=ind'; V001 data-into returnedData V001 %data(RxDataDS.rxdata V001 : %TRIM(DIDataOpts) + '') V001 V001 %parser('YAJLIN'); V001 EndIf; V001 V001 V001 // Cleanup handle. V001 rxCode = axiscTransportDestroy(tHandle); V001 EXSR Exit; V001 V001 BEGSR exit; V001 *INLR=*ON; V001 EndSr; V001 V001 V001 V001 // ========================================= V001 // Handle error V001 // ========================================= V001 DCL-PROC checkError ; V001 dcl-pi *n LIKEDS(CheckErrorDS); V001 handle LIKE(thandle) const; V001 msg varchar(5000) const; V001 end-pi; V001 V001 DCL-S axisCode LIKE(rxCode); V001 DCL-S statusCode POINTER; V001 DCL-S rc INT(10); V001 DCL-DS OutDS LIKEDS(CheckErrorDS); V001 V001 axisCode = axiscTransportGetLastErrorCode(handle); V001 OutDS.outErrorMsg = %TRIM(msg) + ' call failed: ' + V001 %CHAR(axisCode) + ':' + V001 %STR(axiscTransportGetLastError(handle)); V001 V001 if (axisCode = EXC_TRANSPORT_HTTP_EXCEPTION); V001 rc = axiscTransportGetProperty(handle: V001 AXISC_PROPERTY_HTTP_STATUS_CODE: %ADDR(statusCode)); V001 OutDS.outStatus = %STR(statusCode); V001 endif; V001 return OutDS; V001 END-PROC checkError; V001 V001 // ========================================= V001 // Flush and Receive data V001 // ========================================= V001 DCL-PROC ReceiveData; V001 dcl-pi *n LIKEDS(rxdataDS); V001 handle LIKE(thandle) const; V001 end-pi; V001 V001 DCL-S header POINTER; V001 DCL-S bytesRead INT(10) inz(0); V001 DCL-S response LIKE(RxDataDS.rxdata); V001 DCL-S rc LIKE(rxCode); V001 DCL-DS ErrorDS LIKEDS(CheckErrorDS); V001 DCL-DS ReturnDS LIKEDS(rxdataDS); V001 V001 V001 clear response; V001 clear header; V001 V001 // Flush data so request is sent V001 rc = axiscTransportFlush(Handle); V001 if (rc = -1); V001 ErrorDS = checkError (Handle:'TransportFlush()'); V001 ReturnDS.outStatus = ErrorDS.outStatus; V001 ReturnDS.outErrorMsg = ErrorDS.outErrorMsg; V001 return ReturnDS; V001 endif; V001 V001 // Receive data and print out data and response to stdout V001 rc = axiscTransportReceive(Handle: V001 %ADDR(response): %SIZE(response): 0); V001 if (rc = 0); V001 ReturnDS.outErrorMsg = 'No data to read'; V001 else; V001 dow rc > 0 AND bytesRead < %SIZE(response); V001 bytesRead = bytesRead + rc; V001 rc = axiscTransportReceive(Handle: V001 %ADDR(response)+bytesRead: V001 %SIZE(response)-bytesRead: V001 0); V001 enddo; V001 endif; V001 V001 if (rc = -1); V001 ErrorDS = checkError (Handle:'TransportReceive()'); V001 ReturnDS.outStatus = ErrorDS.outStatus; V001 ReturnDS.outErrorMsg = ErrorDS.outErrorMsg; V001 elseif (bytesRead > 0); V001 ReturnDS.responseSize = bytesRead; V001 ReturnDS.rxdata = response; V001 endif; V001 V001 if (rc > -1); V001 rc = axiscTransportGetProperty(Handle: V001 AXISC_PROPERTY_HTTP_STATUS_CODE: V001 %addr(header)); V001 if (rc = -1); V001 ErrorDS = checkError (Handle:'TransportGetProperty()'); V001 ReturnDS.outStatus = ErrorDS.outStatus; V001 ReturnDS.outErrorMsg = ErrorDS.outErrorMsg; V001 else; V001 ReturnDS.outStatus = %str(header); V001 endif; V001 endif; V001 V001 return ReturnDS; V001 V001 END-PROC ReceiveData; V001