inputting an array in a SOAP request - soap

I have a SOAP request that I generated from SOAP UI and see how to specify strings and ints, but I'm not sure how to input the array for the testAddress field. Here's the wsdl and below is the soap request. Any idea how I say either one email address or two. tim#tim.com and tom#tim.com. Thanks!
http://api.stormpost.datranmedia.com/services/SoapRequestProcessor?wsdl
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://services.web.stormpost.skylist.com">
<soapenv:Header>
<authInfo xsi:type="soap:authentication" xmlns:soap="http://skylist.com/services/SoapRequestProcessor">
<!--You may enter the following 2 items in any order-->
<username xsi:type="xsd:string">username</username>
<password xsi:type="xsd:string">password</password>
</authInfo>
</soapenv:Header>
<soapenv:Body>
<ser:sendTestMessage soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<mailingID xsi:type="xsd:int">#trim(mailingID)#</mailingID>
<testAddresses xsi:type="soap:ArrayOf_soapenc_string" soapenc:arrayType="soapenc:string[]" xmlns:soap="http://skylist.com/services/SoapRequestProcessor" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"/>
<part xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">html</part>
</ser:sendTestMessage>
</soapenv:Body>
</soapenv:Envelope>

<ser:sendTestMessage soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<cfoutput> <mailingID xsi:type="xsd:int">#trim(mailingID)#</mailingID></cfoutput>
<testAddresses xsi:type="soap:ArrayOf_soapenc_string" soapenc:arrayType="soapenc:string[1]" xmlns:soap="http://skylist.com/services/SoapRequestProcessor" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<testAddresses xsi:type="xsd:string">tim#tim.com</testAddresses>
</testAddresses>
<part xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">HTML</part>
</ser:sendTestMessage>

Related

SuiteTalk SOAP API TransactionSearchBasic with type journalEntry fails

I tried fetching all the journal entries in my account using the SuiteTalk SOAP API.
But it fails with the message
The field type's enum value <journalEntry> is invalid for this
search.
The Request and Response are as follows:
==================== Beginning of Request ====================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<ns1:searchPreferences xmlns:ns1="urn:messages_2021_1.platform.webservices.netsuite.com" soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0">
<ns1:pageSize>20</ns1:pageSize>
</ns1:searchPreferences>
<ns2:tokenPassport xmlns:ns2="urn:messages_2021_1.platform.webservices.netsuite.com" soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0">
<ns3:account xmlns:ns3="urn:core_2021_1.platform.webservices.netsuite.com">#####</ns3:account>
<ns4:consumerKey xmlns:ns4="urn:core_2021_1.platform.webservices.netsuite.com">#####3</ns4:consumerKey>
<ns5:token xmlns:ns5="urn:core_2021_1.platform.webservices.netsuite.com">#####</ns5:token>
<ns6:nonce xmlns:ns6="urn:core_2021_1.platform.webservices.netsuite.com">#####</ns6:nonce>
<ns7:timestamp xmlns:ns7="urn:core_2021_1.platform.webservices.netsuite.com">#####</ns7:timestamp>
<ns8:signature xmlns:ns8="urn:core_2021_1.platform.webservices.netsuite.com" algorithm="HMAC-SHA256">#####</ns8:signature>
</ns2:tokenPassport>
</soapenv:Header>
<soapenv:Body>
<search xmlns="urn:messages_2021_1.platform.webservices.netsuite.com">
<searchRecord xmlns:ns9="urn:common_2021_1.platform.webservices.netsuite.com" xsi:type="ns9:TransactionSearchBasic">
<ns9:type xmlns:ns10="urn:core_2021_1.platform.webservices.netsuite.com" operator="anyOf" xsi:type="ns10:SearchEnumMultiSelectField">
<ns10:searchValue xsi:type="xsd:string">journalEntry</ns10:searchValue>
</ns9:type>
</searchRecord>
</search>
</soapenv:Body>
</soapenv:Envelope>
==================== End of Request ====================
==================== Beginning of Response ====================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<platformMsgs:documentInfo xmlns:platformMsgs="urn:messages_2021_1.platform.webservices.netsuite.com">
<platformMsgs:nsId>#####</platformMsgs:nsId>
</platformMsgs:documentInfo>
</soapenv:Header>
<soapenv:Body>
<searchResponse xmlns="urn:messages_2021_1.platform.webservices.netsuite.com">
<platformCore:searchResult xmlns:platformCore="urn:core_2021_1.platform.webservices.netsuite.com">
<platformCore:status isSuccess="true">
<platformCore:statusDetail type="WARN">
<platformCore:code>WARNING</platformCore:code>
<platformCore:message>The field type's enum value <journalEntry> is invalid for this search.</platformCore:message>
</platformCore:statusDetail>
</platformCore:status>
<platformCore:totalRecords>0</platformCore:totalRecords>
<platformCore:totalPages>0</platformCore:totalPages>
<platformCore:searchId>#####a</platformCore:searchId>
<platformCore:recordList/>
</platformCore:searchResult>
</searchResponse>
</soapenv:Body>
</soapenv:Envelope>
==================== End of Response ====================
The permissions for the role are as follows:
You should use the TransactionType enum ex in java:
SearchEnumMultiSelectField searchTypeValue = new SearchEnumMultiSelectField();
searchTypeValue.getSearchValue().add(TransactionType.JOURNAL.value());
The search type string should be "_journal":
<search xmlns="urn:messages_2021_1.platform.webservices.netsuite.com">
<searchRecord xmlns:ns9="urn:common_2021_1.platform.webservices.netsuite.com" xsi:type="ns9:TransactionSearchBasic">
<ns9:type xmlns:ns10="urn:core_2021_1.platform.webservices.netsuite.com" operator="anyOf" xsi:type="ns10:SearchEnumMultiSelectField">
<ns10:searchValue xsi:type="xsd:string">_journal</ns10:searchValue>
</ns9:type>
</searchRecord>
</search>
See https://www.netsuite.com/help/helpcenter/en_US/srbrowser/Browser2021_1/schema/enum/transactiontype.html?mode=package and https://www.netsuite.com/help/helpcenter/en_US/srbrowser/Browser2021_1/schema/search/transactionsearchbasic.html?mode=package
You should always use the Schema Browser to look these things up, since they can be different between different uses.
Depending on how you are generating the SOAP message, how you get the string can vary. If using C#, Visual Studio, and the proxy classes created from the WSDL, there should be an enum that gets you the right string values.
EDIT:
Specifically, the values are stored in a public enum called RecordType. In C#, RecordType.JournalEntry (which has an integer value of 94) will place "_journal" in the SOAP message.

Manipulate soap request xml inside OnWriteStartBody(XmlDictionaryWriter writer)

I'm calling a soap web service that is very strict on the request from inside an asp.net core API.
by overriding OnWriteStartBody,OnWriteBodyContents,OnWriteStartEnvelope methods in the System.ServiceModel.Channels.Message class.
my XML
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://POWebservice/">
<soapenv:Body>
<ns1:myaction
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<trantype>purchase</trantype>
<tranamount>94999.23</tranamount>
</ns1:myaction>
</soapenv:Body>
</soapenv:Envelope>
what they expect :
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://POWebservice/">
<soapenv:Body>
<ns1:myaction>
<trantype>purchase</trantype>
<tranamount>94999.23</tranamount>
</ns1:myaction>
</soapenv:Body>
</soapenv:Envelope>
i want to get rid of xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
I have been able to modify some of the payload using
protected override void OnWriteStartEnvelope(XmlDictionaryWriter writer)
{
writer.WriteStartElement("soapenv", "Envelope", "http://schemas.xmlsoap.org/soap/envelope/");
}
i have also attempted to implement the IClientMessageInspector but the intercepted message in BeforeSendRequest had only the header and not the body. plus it had too many hacks .

How to use mutiple values in input parameters in soap call

I have a current requirement where I need to make a soap call to retrieve the data for further business intelligence. I have no experience in SOAP.
The service call is called getSiteInfo.
getSiteInfo has following 4 parameters- userName, password, custNbr, siteId.
Now I can make calls like this and it generates an xml response
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bil="http://billing.xyz.cc/">
<soapenv:Header/>
<soapenv:Body>
<bil:getSiteInfo>
<!--userName:-->
<arg0>username</arg0>
<!--password:-->
<arg1>pswd</arg1>
<!--custNbr:-->
<arg2>288</arg2>
<!--siteId:-->
<arg3>0862578</arg3>
</bil:getSiteInfo>
</soapenv:Body>
</soapenv:Envelope>
I was wondering is it possible to include multiple siteId in the same call instead of doing it repeatedly for almost 1000+ siteIds.
I tried the following two to see if they work and none of them did. It only returned the response for the last item; 108952 in this case.
Method1
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bil="http://billing.xyz.cc/">
<soapenv:Header/>
<soapenv:Body>
<bil:getSiteInfo>
<!--userName:-->
<arg0>username</arg0>
<!--password:-->
<arg1>pswd</arg1>
<!--customerNumber:-->
<arg2>288</arg2>
<!--siteNumber:-->
<arg3>0862578</arg3>
<arg3>108952</arg3>
</bil:getSiteInfo>
</soapenv:Body>
</soapenv:Envelope>
Method2
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bil="http://billing.xyz.cc/">
<soapenv:Header/>
<soapenv:Body>
<bil:getSiteInfo>
<!--userName:-->
<arg0>username</arg0>
<!--password:-->
<arg1>pswd</arg1>
<!--customerNumber:-->
<arg2>288</arg2>
<!--siteNumber:-->
<arg3>108952</arg3>
</bil:getSiteInfo>
<bil:getSiteInfo>
<!--userName:-->
<arg0>username</arg0>
<!--password:-->
<arg1>pswd</arg1>
<!--customerNumber:-->
<arg2>288</arg2>
<!--siteNumber:-->
<arg3>0862578</arg3>
</bil:getSiteInfo>
</soapenv:Body>
</soapenv:Envelope>
Thank you very much in advance.

Receiving No WS-Security Header error when attempting to POST to Cybersource Simple Order API

I am attempting to POST using Postman to the Cybersource Simple Order API, but it comes back with a no header error when doing so. What am I doing wrong here? Since the merchant ID is used as the username, what is used as the password, should this be the Simple Order transaction processing key?
Posting the following XML data to the test endpoint (https://ics2wstesta.ic3.com/commerce/1.x/transactionProcessor):
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>merchantname</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile1.0#PasswordText">key</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<requestMessage xmlns="urn:schemas-cybersource-com:transaction-data-1.150">
<merchantID>merchantname</merchantID>
<merchantReferenceCode>12345678912</merchantReferenceCode>
<recurringSubscriptionInfo>
<subscriptionID>12345678901234567890</subscriptionID>
</recurringSubscriptionInfo>
<paySubscriptionDeleteService run="true"/>
</requestMessage>
</soapenv:Body>
</soapenv:Envelope>
You have a small error in your namespaces. You missed a "-".
oasis-200401-wss-wssecurity-secext1.0.xsd
should be
oasis-200401-wss-wssecurity-secext-1.0.xsd
and
oasis-200401-wss-username-token-profile1.0#PasswordText
should be
oasis-200401-wss-username-token-profile-1.0#PasswordText

Adwords SOAP XML request against ManagedCustomerService fails

I'm working with https://adwords.google.com/api/adwords/mcm/v201402/ManagedCustomerService and wanting to get the account hierarchy.
The requests are being made in raw XML (controlled by JScript) -- a bit perverse, I know, but that's the situation.
I've generated the following SOAP packet
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<ns1:RequestHeader soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0" xmlns:ns1="https://adwords.google.com/api/adwords/mcm/v201402">
<ns1:clientCustomerId>some_ccid</ns1:clientCustomerId>
<ns1:developerToken>some_developer_token</ns1:developerToken>
<ns1:userAgent>GAS</ns1:userAgent>
<ns1:validateOnly>false</ns1:validateOnly>
<ns1:partialFailure>false</ns1:partialFailure>
</ns1:RequestHeader>
</soapenv:Header>
<soapenv:Body>
<get xmlns="https://adwords.google.com/api/adwords/mcm/v201402">
<serviceSelector>
<fields>Login</fields>
<fields>Customer</fields>
<fields>Name</fields>
<predicate>
<field>id</field>
<operator>GREATER_THAN</operator>
<values>0</values>
</predicate>
</serviceSelector>
</get>
</soapenv:Body>
</soapenv:Envelope>
Please note the idGREATER_THAN0. This is my naive way of getting everything.
I notice that the PHP GetAccountHierarchy.php has
// Create selector.
$selector = new Selector();
// Specify the fields to retrieve.
$selector->fields = array('Login', 'CustomerId', 'Name');
// Make the get request.
$graph = $managedCustomerService->get($selector);
This would seem to imply that no predicate has been defined. However, I'm a bit leery of doing that because the documentation says (yes, I do read the friendly manual), "predicates ContentsNotNull"
The response I get is
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<ns2:ResponseHeader xmlns:ns2="https://adwords.google.com/api/adwords/mcm/v201402" xmlns="https://adwords.google.com/api/adwords/cm/v201402">
<requestId>0004f553e08eaca00abc25900000893f</requestId>
<serviceName>ManagedCustomerService</serviceName>
<methodName>get</methodName>
<operations>0</operations>
<responseTime>141</responseTime>
</ns2:ResponseHeader>
</soap:Header>
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>[QuotaCheckError.INVALID_TOKEN_HEADER # ]</faultstring>
<detail>
<ns2:ApiExceptionFault xmlns="https://adwords.google.com/api/adwords/cm/v201402" xmlns:ns2="https://adwords.google.com/api/adwords/mcm/v201402">
<message>[QuotaCheckError.INVALID_TOKEN_HEADER # ]</message>
<ApplicationException.Type>ApiException</ApplicationException.Type>
<errors xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="QuotaCheckError">
<fieldPath/>
<trigger/>
<errorString>QuotaCheckError.INVALID_TOKEN_HEADER</errorString>
<ApiError.Type>QuotaCheckError</ApiError.Type>
<reason>INVALID_TOKEN_HEADER</reason>
</errors>
</ns2:ApiExceptionFault>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
What am I doing incorrectly that I should get such a response?
BTW, if I do leave out the predicate or specify it with a null content, I still get the QuotaCheckError.INVALID_TOKEN_HEADER error.
A solution has been provided on the Adwords API google group. Working nicely now!