[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: XML Error



Thanks for the response Scott,
I will do my best to provide additional information.    

First.  I was thinking the same that it would follow an HTTPS form post, but I've scoured the developers guide, and I cannot see anywhere where the specify a "form"  for a HTTPS post, nor do they talk about any encoding.   

Secondly, 
If needed, I can send you a copy of the developers guide


Now onto Postman,   
Postman is a little free add in program for Google Chrome.    It allows for testing of various API's.
The way it works is I select a "post" request type, and then I copy and past into the requesting URL field  the request string.   

i.e.
https://demo.myvirtualmerchant.com/VirtualMerchantDemo/processxml.do?xmldata=<txn><ssl_transaction_type>ccgettoken</ssl_transaction_type><ssl_merchant_id>007994</ssl_merchant_id><ssl_user_id>webpage</ssl_user_id><ssl_pin>INGKQT</ssl_pin><ssl_show_form>false</ssl_show_form><ssl_first_name>Mickey Mouse</ssl_first_name><ssl_avs_address>100 Disney Lane</ssl_avs_address><ssl_city>DisneyWorld</ssl_city><ssl_state>FL</ssl_state><ssl_avs_zip>12345</ssl_avs_zip><ssl_card_number>4111111111111111</ssl_card_number><ssl_exp_date>0119</ssl_exp_date><ssl_cvv2cvc2_indicator>0</ssl_cvv2cvc2_indicator><ssl_get_token>Y</ssl_get_token><ssl_add_token>Y</ssl_add_token><ssl_description>Test get token</ssl_description><ssl_customer_number>8888888</ssl_customer_number></txn>



     
 



Alan Frentz






-----Original Message-----
From: ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx [mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of Scott Klement
Sent: Monday, March 28, 2016 4:00 PM
To: HTTPAPI and FTPAPI Projects <ftpapi@xxxxxxxxxxxxxxxxxxxxxx>
Subject: Re: XML Error

Alan,

The data you're sending does not look right to  me.  It begins with "xmldata=" as if it is supposed to be a URL-encoded web form.  But, it is not properly encoded for a web form, and the content-type says it's XML.

but, legitimate XML cannot start wtih "xmldata=".

I am not familiar with your web service, and I cannot tell you which format it is supposed to be in, but to me this looks highly unlikely to be correct as it appears to be a confused mixture between two different ways of encoding data.

You say it works when using something called "postman" (never heard of that).  Maybe you can tell us more about what you're sending in that case?

-SK


On 3/28/2016 8:39 AM, Alan Frentz wrote:
>     Hi,
>
>
>     This is my first time using HTTPAPI for an interface.   I am working on
>     building some prototypes that will allow us to send Credit Card
>     transactions to a processing company.   I have patterned my test
>     program after the Example 14 source.
>
>
>     However, with my program I am getting a
>     java.lang.nullpointerException    message when I try the post.
>
>
>     In looking at the request XML string there does not appear to be any
>     errors, (in fact I can copy the xml string and execute a ReST post via
>     postman and I get back a valid response)
>
>     I'm sure I'm just missing something simple, but I can't seem to figure
>     out what is wrong.
>
>
>     Any assistance or guidance you can provide is much appreciated.
>
>     Thanks
>
>
>
>     Alan Frentz
>
>
>
>     Here is the program source code......
>
>     H DFTACTGRP(*NO) BNDDIR('LIBHTTP/HTTPAPI':'QC2LE') ACTGRP(*NEW)
>
>     H Option( *SrcStmt: *NoDebugIO  )
>
>     H DatFmt(*USA)
>
>     H TimFmt(*HMS)
>
>
>
>      *
>
>      * This demonstrates using HTTPAPI's functions to submit an
>
>      * xml request to a webpage.
>
>      *
>
>      * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>
>      *%* See CMPSRC documentation for explanation of % comments.
>
>      *%p DFTACTGRP(*NO) ACTGRP(QILE) +
>
>      *%p BndDir(LIBHTTP/HTTPAPI QC2LE SRVDIR)
>
>      * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>
>
>
>     D/copy qrpglesrc,httpapi_h
>
>
>
>
>
>
>
>      * ---------------------------------------------
>
>      * Procedures
>
>      * ---------------------------------------------
>
>
>
>     D addTag          PR          1024A   varying
>
>     D   tag                        128A   varying const
>
>     D   text                      1024A   value
>
>
>
>     D gsub            PR          1024A   varying
>
>     D   inp                       1024A   varying const
>
>     D   from                       128A   varying const
>
>     D   to                         128A   varying const
>
>
>
>
>
>
>
>     D StartOfElement  PR
>
>     D   UserData                      *   value
>
>     D   depth                       10I 0 value
>
>     D   name                      1024A   varying const
>
>     D   path                     24576A   varying const
>
>     D   attrs                         *   dim(32767)
>
>     D                                     const options(*varsize)
>
>     D EndOfElement    PR
>
>     D   UserData                      *   value
>
>     D   depth                       10I 0 value
>
>     D   name                      1024A   varying const
>
>     D   path                     24576A   varying const
>
>     D   value                    65535A   varying const
>
>     D   attrs                         *   dim(32767)
>
>     D                                     const options(*varsize)
>
>
>
>
>
>      * Stand-alone field definitions
>
>     D data            s         256000    varying
>
>     D dataFixed       s         256000
>
>     D dataLen         s             10I 0
>
>     D msg             s             52A
>
>     D nextpos         S             10I 0 inz(1)
>
>     D ok              s              1N
>
>     D rc              s             10I 0
>
>     D reqXML          s           4096A   varying
>
>     D retdata         S          32766A
>
>     D retlen          S             10I 0
>
>     D URL             s            256A   varying
>
>     D xmldata         s        9000000
>
>
>
>
>     d Count           s             10I 0
>
>     d activity        ds                  qualified
>
>     d   array                             dim(100)
>
>     d   Response                  4096A   overlay(array:*next)
>
>
>
>
>
>
>
>
>
>      * Named constants for readability
>
>     D TRUE            C                   *On
>
>     D FALSE           C                   *Off
>
>     D DEBUG_LOG       C                   *On
>
>     D CRLF            C                   CONST(x'0D25')
>
>
>
>      * Test gateway and server (comment this or the live gateway)
>
>     D SERVER          C
>     'https://demo.myvirtualmerchant.com/-
>
>     D
>     VirtualMerchantDemo/processxml.do'
>
>     D MerchantID      C                   '007994'
>
>     D User_ID         C                   'webpage'
>
>     D User_PIN        C                   'INGKQT'
>
>
>
>
>
>
>
>     C/Free
>
>
>
>         http_debug(DEBUG_LOG);
>
>         http_XmlStripCRLF(*ON);
>
>
>
>
>
>         // Initialize request XML with tags which are always sent
>
>        reqxml = 'xmldata=' +
>
>              '<txn>' +
>
>              addTag('ssl_transaction_type' : 'ccgettoken' ) +
>
>              addTag('ssl_merchant_id'      : MerchantID    ) +
>
>              addTag('ssl_user_id'          : User_ID       ) +
>
>              addTag('ssl_pin'              : User_PIN      ) +
>
>              addTag('ssl_show_form'        : 'false');
>
>
>        // setup cardholder information
>
>        reqXML = %Trim(reqXML) +
>
>                addTag('ssl_first_name' : 'Mickey Mouse');
>
>        reqXML = %Trim(reqXML) +
>
>                addTag('ssl_avs_address' : '100 Disney Lane');
>
>        reqXML = %Trim(reqXML) +
>
>                addTag('ssl_city' : 'DisneyWorld' ) +
>
>                addTag('ssl_state'      : 'FL'  ) +
>
>                addTag('ssl_avs_zip'    : '12345' );
>
>
>        // tags for the CC number and expiration date
>
>        reqXML = %Trim(reqXML) +
>
>                addTag('ssl_card_number' : '4111111111111111' ) +
>
>                addTag('ssl_exp_date'   :  '0119' ) +
>
>                addTag('ssl_cvv2cvc2_indicator'  : '0');
>
>
>        // tags for saving token
>
>        reqXML = %Trim(reqXML) + addTag('ssl_get_token' : 'Y');
>
>        reqXML = %trim(reqXML) + addTag('ssl_add_token' : 'Y');
>
>
>        // Add in the description
>
>        reqXML = %Trim(reqXML)
>
>                   + addTag('ssl_description': 'Test get token' );
>
>
>       // send the customer number
>
>       reqXML = %Trim(reqXML) +
>
>                addTag('ssl_customer_number'  : '8888888');
>
>
>       // Now wrap up the XML request
>
>       reqXML = %Trim(reqXML) + '</txn>' + CRLF;
>
>
>
>
>       // Send POST
>
>       clear retdata;
>
>       dataLen = %len( %trimr( reqXML ));
>
>       dataFixed = %subst( reqXML : 1 : dataLen );
>
>       URL = Server;
>
>
>        rc = http_url_post_xml(%trimR(URL)
>
>              : %addr(reqXML) + 2
>
>              : %len( %trimR( reqXML ))
>
>              : %paddr(StartofElement)
>
>              : %paddr(EndOfElement)
>
>              : *NULL );
>
>
>
>        if rc <> 1;
>
>          msg = http_error;
>
>        else;
>
>          msg = '';
>
>        endif;
>
>
>       // do something with the valid response
>
>        *inlr = *on;
>
>      /End-free
>
>
>
>
>
>
>
>     
> P*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>
>     P*  this procedure formats a XML tag
>
>     
> P*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>
>     P addTag          B
>
>
>
>     D addTag          PI          1024A   varying
>
>     D   tag                        128A   varying const
>
>     D   text                      1024A   value
>
>
>
>
>     D tagData         S           1024A   varying
>
>
>     c/Free
>
>        // Initialize to trimmed version of data to send
>
>        tagData = %trim(text);
>
>
>        // Now escape characters sensitive to XML tags
>
>        tagData = gsub( tagData: '&': '&amp;' );
>
>        tagData = gsub( tagData: '<': '&lt;' );
>
>        tagData = gsub( tagData: '>': '&gt;' );
>
>        tagData = gsub( tagData: '"': '&quot;' );
>
>        tagData = gsub( tagData: '''':'&apos;' );
>
>
>        // Now build up tagged data
>
>        tagData = '<' + tag + '>' + tagData + '</' + tag + '>';
>
>        tagData = '<' + tag + '>' + tagData + '</' + tag + '>';
>
>
>
>        return tagData;
>
>      /End-free
>
>     P                 E
>
>
>
>
>
>     
> P*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>
>     P*  this procedure performs a global string substitution
>
>     
> P*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>
>     P gsub            B
>
>
>
>     D gsub            PI          1024A   varying
>
>     D   inp                       1024A   varying const
>
>     D   from                       128A   varying const
>
>     D   to                         128A   varying const
>
>
>
>     D outText         S           1024A   varying
>
>     D i               S             10I 0
>
>     D fromLen         S             10I 0
>
>     D toLen           S             10I 0
>
>
>
>     c/Free
>
>        // Initialize output text to input text
>
>        outText = inp;
>
>        fromLen = %len(from);
>
>        toLen   = %len(to);
>
>
>
>        // Now repeatively look for substring to replace
>
>        i = %scan( from: outText: 1 );
>
>        dow (i > 0);
>
>          select;
>
>          when i = 1;
>
>            outText = to + %subst( outText: fromLen + 1 );
>
>          when (i + fromLen) >= %len( outText );
>
>            outText = %subst( outText: 1: i - 1 ) + to;
>
>          other;
>
>            outText = %subst( outText: 1: i - 1 ) + to +
>
>                      %subst( outText: i + fromLen );
>
>          endsl;
>
>          i = %scan( from: outText: i + fromLen );
>
>        enddo;
>
>
>        return outText;
>
>      /End-free
>
>     P                 E
>
>     
> P*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>
>     P*  this procedure will be executed at the beginning of each 
> element
>
>     P*  received back  i.e.  start of tag
>
>     
> P*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>
>     P StartOfElement  B
>
>     D StartOfElement  PI
>
>     D   UserData                      *   value
>
>     D   depth                       10I 0 value
>
>     D   name                      1024A   varying const
>
>     D   path                     24576A   varying const
>
>     D   attrs                         *   dim(32767)
>
>     D                                     const options(*varsize)
>
>      /free
>
>
>
>        if path = 'txn';
>
>           count = count + 1;
>
>        endif;
>
>
>
>        // make sure we found at least one transaction
>
>        if Count = 0;
>
>           count = count + 1;
>
>        endif;
>
>
>
>      /end-free
>
>     P                 E
>
>
>
>
>
>
>
>     
> P*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>
>     P*  this procedure will be executed at the beginning of each 
> element
>
>     P*  received back  i.e.  start of tag
>
>     
> P*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>
>     P EndOfElement    B
>
>     D EndOfElement    PI
>
>     D   UserData                      *   value
>
>     D   depth                       10I 0 value
>
>     D   name                      1024A   varying const
>
>     D   path                     24576A   varying const
>
>     D   value                    65535A   varying const
>
>     D   attrs                         *   dim(32767)
>
>     D                                     const options(*varsize)
>
>      /free
>
>
>
>       select;
>
>       when path = '/txn';
>
>         activity.Response(count) = value;
>
>       Other;
>
>         activity.Response(count) = value;
>
>       endsl;
>
>
>      /end-free
>
>     P                 E
>
>
>
>
>
>
>     And here is the debug log
>
>
>
>     HTTPAPI Ver 1.29 released 2015-02-23
>
>     NTLM Ver 1.4.0 released 2014-12-22
>
>     OS/400 Ver V7R1M0
>
>
>     New iconv() objects set, PostRem=819. PostLoc=0. ProtRem=819. 
> ProtLoc=0
>
>     http_persist_open(): entered
>
>     http_long_ParseURL(): entered
>
>     DNS resolver retrans: 2
>
>     DNS resolver retry  : 2
>
>     DNS resolver options: x'00000136'
>
>     DNS default domain: sullivangift.com
>
>     DNS server found: 24.220.0.11
>
>     DNS server found: 24.220.0.10
>
>     https_init(): entered
>
>     QSSLPCL = *TLSV1.2 *TLSV1.1 *TLSV1
>
>     SSL version 2 support disabled
>
>     SSL version 3 support disabled
>
>     Old interface to TLS version 1.0 support enabled
>
>     TLS version 1.0 support enabled
>
>     TLS version 1.1 support enabled
>
>     TLS version 1.2 support enabled
>
>     -----------------------------------------------------------------------
>     --------------
>
>     Dump of local-side certificate information:
>
>     -----------------------------------------------------------------------
>     --------------
>
>     Nagle's algorithm (TCP_NODELAY) disabled.
>
>     SNI hostname set to: demo.myvirtualmerchant.com
>
>
>     Serial Number: 3F:94:3B:4A:01:B3:B4:49:4A:30:54:38:FA:46:BB:53
>
>     Common Name: demo.myvirtualmerchant.com
>
>     Country: US
>
>     State/Province: Georgia
>
>     Locality: Atlanta
>
>     Org Unit: Elavon Inc
>
>     Org: SYSTEMS
>
>     Issuer CN: Symantec Class 3 Secure Server CA - G4
>
>     Issuer Country: US
>
>     Issuer Org: Symantec Corporation
>
>     Issuer Org Unit: Symantec Trust Network
>
>     Version: 3
>
>     not before: 20160113180000
>
>     Unknown Field: 18:00:00 13-01-2016
>
>     not after: 20170114175959
>
>     Unknown Field: 17:59:59 14-01-2017
>
>     pub key alg: 1.2.840.113549.1.1.11
>
>
>     Protocol Used: TLS Version 1.2
>
>     http_persist_post(): entered
>
>     http_persist_req(POST) entered.
>
>     http_long_ParseURL(): entered
>
>     http_long_ParseURL(): entered
>
>     do_oper(POST): entered
>
>     There are 0 cookies in the cache
>
>     POST /VirtualMerchantDemo/processxml.do HTTP/1.1
>
>     Host: demo.myvirtualmerchant.com
>
>     User-Agent: http-api/1.29
>
>     Content-Type: text/xml
>
>     Content-Length: 693
>
>
>
>     senddoc(): entered
>
>     xmldata=<txn><ssl_transaction_type>ccgettoken</ssl_transaction_type><ss
>     l_merchant_id>007994</ssl_merchant_id><ssl_user_id>webpage</ssl_user_id
>     ><ssl_pin>INGKQT</ssl_pin><ssl_show_form>false</ssl_show_form><ssl_firs
>     t_name>Mickey Mouse</ssl_first_name><ssl_avs_address>100 Disney
>     Lane</ssl_avs_address><ssl_city>DisneyWorld</ssl_city><ssl_state>FL</ss
>     l_state><ssl_avs_zip>12345</ssl_avs_zip><ssl_card_number>41111111111111
>     11</ssl_card_number><ssl_exp_date>0119</ssl_exp_date><ssl_cvv2cvc2_indi
>     cator>0</ssl_cvv2cvc2_indicator><ssl_get_token>Y</ssl_get_token><ssl_ad
>     d_token>Y</ssl_add_token><ssl_description>Test get
>     token</ssl_description><ssl_customer_number>8888888</ssl_customer_numbe
>     r></txn>
>
>
>     recvresp(): entered
>
>     HTTP/1.1 200 OK
>
>     Date: Mon, 28 Mar 2016 13:11:32 GMT
>
>     Pragma: no-cache
>
>     Cache-Control: no-store, no-cache, must-revalidate, post-check=0,
>     pre-check=0
>
>     Expires: 0
>
>     Content-Length: 151
>
>     Set-Cookie: JSESSIONID=0000M9iUUPFBVgFLHsdRzwn--xg:14j4qkv92; HTTPOnly;
>     Path=/; Secure
>
>     Content-Type: text/xml;charset=ISO-8859-1
>
>     Content-Language: en-US
>
>     X-Frame-Options: SAMEORIGIN
>
>
>
>     SetError() #13: HTTP/1.1 200 OK
>
>     recvresp(): end with 200
>
>     recvdoc parms: identity 151
>
>     header_load_cookies() entered
>
>     cookie_parse() entered
>
>     cookie =  JSESSIONID=0000M9iUUPFBVgFLHsdRzwn--xg:14j4qkv92; HTTPOnly;
>     Path=/; Secure
>
>     cookie attr JSESSIONID=0000M9iUUPFBVgFLHsdRzwn--xg:14j4qkv92
>
>     cookie attr HTTPOnly=
>
>     cookie attr Path=/
>
>     cookie attr Secure=
>
>     recvdoc(): entered
>
>     SetError() #0:
>
>
>
>
>
>
>
>
>
>
>     <txn>
>
>     <errorCode>UNKNOWN</errorCode>
>
>     <errorName>UNKNOWN ERROR</errorName>
>
>     <errorMessage>java.lang.NullPointerException</errorMessage>
>
>     </txn>
>
>
>
>     http_close(): entered
>
>
>
> ----------------------------------------------------------------------
> - This is the FTPAPI mailing list.  To unsubscribe, please go to:
> http://www.scottklement.com/mailman/listinfo/ftpapi
> ----------------------------------------------------------------------
> -

-----------------------------------------------------------------------
This is the FTPAPI mailing list.  To unsubscribe, please go to:
http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------
-----------------------------------------------------------------------
This is the FTPAPI mailing list.  To unsubscribe, please go to:
http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------