I'm trying to accomplish this:
POST /oms/order.asmx HTTP/1.1
Host:myserver.com
Content-Type: text/xml;
charset=utf-8
Content-Length: length
SOAPAction: "http://shipping_software/AddOrder"
By doing this:
var newOrder = buildOrder(orderInfo);
var soapOptions = {
uri: '/oms/order.asmx',
headers: {
'Content-Type': 'text/xml',
'charset': 'utf-8',
'Content-Length': newOrder.length.toString(),
'SOAPAction': 'http://shipping_software/AddOrder',
'Host': 'myserver.com',
'Connection': 'keep-alive'
},
method: 'POST',
body: newOrder //New order is properly formed xml as a String
}
request(soapOptions, function(err, response) {
console.log(err);
console.log(response);
})
// console.log(newOrder);
});
This currently comes back with 'invalid uri', when I change the URI to http://myserver.com/oms/order.asmx
I still get a 400 response code.
Edit: I fixed the content type to be on one line Content-Type: text/html; charset=utf-8
without any improvement.
Edit2: I'm using XMLBuilder to build my XML data and tried submitting it without converting it to a string, however the connection from the SOAP API times out.
Edit3: full soap request:
POST /oms/order.asmx HTTP/1.1
Host: myserver.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://oms/AddOrder"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AuthenticationHeader xmlns="http://sma-promail/">
<Username>string</Username>
<Password>string</Password>
</AuthenticationHeader>
<DebugHeader xmlns="http://sma-promail/">
<Debug>boolean</Debug>
<Request>string</Request>
</DebugHeader>
</soap:Header>
<soap:Body>
<AddOrder xmlns="http://sma-promail/">
<order>
<Header>
<ID>string</ID>
<EntryDate>dateTime</EntryDate>
<OrderEntryView>
<SeqID>int</SeqID>
<Description>string</Description>
</OrderEntryView>
<ReferenceNumber>string</ReferenceNumber>
<PONumber>string</PONumber>
<Comments>string</Comments>
<IpAddress>string</IpAddress>
<ApprovalComment>string</ApprovalComment>
<InsertDate>dateTime</InsertDate>
</Header>
<Classification>
<CampaignID>string</CampaignID>
<ResponseMedia>
<Description>string</Description>
</ResponseMedia>
<Source>
<Description>string</Description>
</Source>
<Issue>
<Issue>string</Issue>
</Issue>
<CustomerProject>
<ID>string</ID>
</CustomerProject>
<CustomerCode>string</CustomerCode>
<Store>string</Store>
<Department>string</Department>
<DistributionCenter>string</DistributionCenter>
<Vendor>string</Vendor>
</Classification>
<Shipping>
<FreightCarrier>
<Name>string</Name>
</FreightCarrier>
<FreightService>
<Description>string</Description>
</FreightService>
<FreightAccount>
<SeqID>int</SeqID>
<Description>string</Description>
<FreightCarrier xsi:nil="true" />
<Person xsi:nil="true" />
<ThirdAcctNo>string</ThirdAcctNo>
<NonResident>boolean</NonResident>
</FreightAccount>
<ShippingOption>
<Description>string</Description>
</ShippingOption>
<FreightCode>string</FreightCode>
<FreightCodeDescription>string</FreightCodeDescription>
<ShipComments>string</ShipComments>
<NeededBy>string</NeededBy>
<Rush>boolean</Rush>
<ReleaseDate>dateTime</ReleaseDate>
<ThirdPartyType>int</ThirdPartyType>
<ThirdAccountNumber>string</ThirdAccountNumber>
<NCShip>boolean</NCShip>
<NCPack>boolean</NCPack>
<NCOffers>boolean</NCOffers>
<NCHandling>boolean</NCHandling>
<NCOffShipHandling>boolean</NCOffShipHandling>
<NCSpecialHandling>boolean</NCSpecialHandling>
<NCRush>boolean</NCRush>
</Shipping>
<Money>
<PriceClass>
<SeqID>int</SeqID>
<Description>string</Description>
</PriceClass>
<ShippingHandlingCharge>decimal</ShippingHandlingCharge>
<RushHandlingCharge>decimal</RushHandlingCharge>
<NoChargeType>
<Description>string</Description>
</NoChargeType>
<DiscountAmount>decimal</DiscountAmount>
<DiscountPercent>float</DiscountPercent>
<DiscountCode>
<ID>string</ID>
<Description>string</Description>
</DiscountCode>
<Coupon>
<Code>string</Code>
</Coupon>
<SpecialHandlingCharge>decimal</SpecialHandlingCharge>
<CreditAmount>decimal</CreditAmount>
<GiftCertificate>
<UID>string</UID>
<Amount>decimal</Amount>
</GiftCertificate>
<GiftCertificateAmount>decimal</GiftCertificateAmount>
<TaxPercent>decimal</TaxPercent>
<NoChargeAmount>decimal</NoChargeAmount>
<TaxAmount>decimal</TaxAmount>
</Money>
<Payment>
<PaymentType>
<Description>string</Description>
<Sequence>int</Sequence>
</PaymentType>
<PaymentAmount>decimal</PaymentAmount>
<CCNumber>string</CCNumber>
<CCExpirationDate>string</CCExpirationDate>
<CSC>string</CSC>
<ARReference>string</ARReference>
</Payment>
<OrderVariables>
<OrderVariable>
<SeqID>int</SeqID>
<VariableField xsi:nil="true" />
<Value>string</Value>
</OrderVariable>
<OrderVariable>
<SeqID>int</SeqID>
<VariableField xsi:nil="true" />
<Value>string</Value>
</OrderVariable>
</OrderVariables>
<OrderedBy>
<ORDOBY>
<SeqID>int</SeqID>
<CustomerID>string</CustomerID>
</ORDOBY>
<FullName>string</FullName>
<FullNameWithSuffix>string</FullNameWithSuffix>
<CityStateZip>string</CityStateZip>
<CityStateZipCountry>string</CityStateZipCountry>
<CompoundAddress>string</CompoundAddress>
</OrderedBy>
<ShipTo>
<OrderShipTo>
<SeqID>int</SeqID>
<Flag>Other or OrderedBy</Flag>
<Key>string</Key>
<NeededBy>string</NeededBy>
<ReleaseDate>dateTime</ReleaseDate>
<Rush>boolean</Rush>
<RushHandling>decimal</RushHandling>
<Comments>string</Comments>
<FreightCarrier xsi:nil="true" />
<FreightService xsi:nil="true" />
<ThirdPartyType>int</ThirdPartyType>
<ThirdPartyAccountNumber>string</ThirdPartyAccountNumber>
<FreightCode>string</FreightCode>
<FreightCodeDescription>string</FreightCodeDescription>
<SpecialHandling xsi:nil="true" />
<SpecialHandlingCharge>decimal</SpecialHandlingCharge>
<ShippingHandlingCharge>decimal</ShippingHandlingCharge>
<FullName>string</FullName>
<FullNameWithSuffix>string</FullNameWithSuffix>
<CityStateZip>string</CityStateZip>
<CityStateZipCountry>string</CityStateZipCountry>
<CompoundAddress>string</CompoundAddress>
<PickPacks xsi:nil="true" />
</OrderShipTo>
<OrderShipTo>
<SeqID>int</SeqID>
<Flag>Other or OrderedBy</Flag>
<Key>string</Key>
<NeededBy>string</NeededBy>
<ReleaseDate>dateTime</ReleaseDate>
<Rush>boolean</Rush>
<RushHandling>decimal</RushHandling>
<Comments>string</Comments>
<FreightCarrier xsi:nil="true" />
<FreightService xsi:nil="true" />
<ThirdPartyType>int</ThirdPartyType>
<ThirdPartyAccountNumber>string</ThirdPartyAccountNumber>
<FreightCode>string</FreightCode>
<FreightCodeDescription>string</FreightCodeDescription>
<SpecialHandling xsi:nil="true" />
<SpecialHandlingCharge>decimal</SpecialHandlingCharge>
<ShippingHandlingCharge>decimal</ShippingHandlingCharge>
<FullName>string</FullName>
<FullNameWithSuffix>string</FullNameWithSuffix>
<CityStateZip>string</CityStateZip>
<CityStateZipCountry>string</CityStateZipCountry>
<CompoundAddress>string</CompoundAddress>
<PickPacks xsi:nil="true" />
</OrderShipTo>
</ShipTo>
<BillTo>
<Flag>Other or OrderedBy or DoNotUse or ShipTo</Flag>
<FullName>string</FullName>
<FullNameWithSuffix>string</FullNameWithSuffix>
<CityStateZip>string</CityStateZip>
<CityStateZipCountry>string</CityStateZipCountry>
<CompoundAddress>string</CompoundAddress>
</BillTo>
<Offers>
<OfferOrdered>
<Offer xsi:nil="true" />
<Quantity>int</Quantity>
<CanceledQuantity>int</CanceledQuantity>
<OrderShipTo xsi:nil="true" />
<OrderShipToKey xsi:nil="true" />
<PriceType>unsignedByte</PriceType>
<UnitPrice>decimal</UnitPrice>
<ShipType>short</ShipType>
<ShippingHandling>decimal</ShippingHandling>
<Discounts>decimal</Discounts>
<DiscountPercent>int</DiscountPercent>
<DocumentID>string</DocumentID>
<SeqID>int</SeqID>
<CloneLine>int</CloneLine>
<Unapproved>boolean</Unapproved>
<ShipToKey>string</ShipToKey>
<FgnOrder>string</FgnOrder>
<Comments>string</Comments>
<RCOrderKey>string</RCOrderKey>
<Recurring>boolean</Recurring>
<LineNumber>int</LineNumber>
<Variables xsi:nil="true" />
<ProductDetails xsi:nil="true" />
</OfferOrdered>
<OfferOrdered>
<Offer xsi:nil="true" />
<Quantity>int</Quantity>
<CanceledQuantity>int</CanceledQuantity>
<OrderShipTo xsi:nil="true" />
<OrderShipToKey xsi:nil="true" />
<PriceType>unsignedByte</PriceType>
<UnitPrice>decimal</UnitPrice>
<ShipType>short</ShipType>
<ShippingHandling>decimal</ShippingHandling>
<Discounts>decimal</Discounts>
<DiscountPercent>int</DiscountPercent>
<DocumentID>string</DocumentID>
<SeqID>int</SeqID>
<CloneLine>int</CloneLine>
<Unapproved>boolean</Unapproved>
<ShipToKey>string</ShipToKey>
<FgnOrder>string</FgnOrder>
<Comments>string</Comments>
<RCOrderKey>string</RCOrderKey>
<Recurring>boolean</Recurring>
<LineNumber>int</LineNumber>
<Variables xsi:nil="true" />
<ProductDetails xsi:nil="true" />
</OfferOrdered>
</Offers>
<OrderRecurrenceSchedule>
<RecurrenceSchedules>
<SeqID>int</SeqID>
<ID>string</ID>
<Description>string</Description>
<Definition>string</Definition>
<DefinitionDetail>string</DefinitionDetail>
<Schedule>EveryXDays or EveryXWeeks or EveryXMonths</Schedule>
<ScheduleCount>int</ScheduleCount>
<Cycle>Rolling or Custom</Cycle>
<StartCycleDate>dateTime</StartCycleDate>
<DaysToJoin>int</DaysToJoin>
<MonthlyRecurrenceType>DayOfMonth or WeekOfMonthAndDayOfWeek</MonthlyRecurrenceType>
<MinimumRecurrences>int</MinimumRecurrences>
<MaximumRecurrences>int</MaximumRecurrences>
<RecurrenceIncrement>int</RecurrenceIncrement>
<AllowInfiniteRecurrence>boolean</AllowInfiniteRecurrence>
<InfiniteTag>string</InfiniteTag>
<DurationTag>string</DurationTag>
<ExpirationDate>dateTime</ExpirationDate>
<NextCycleDate>dateTime</NextCycleDate>
<HasValidCycleDate>boolean</HasValidCycleDate>
<AnyOffer>boolean</AnyOffer>
<RecurrenceScheduleShippingOptions xsi:nil="true" />
</RecurrenceSchedules>
<RecurrenceOfferFlag>boolean</RecurrenceOfferFlag>
<RecurrenceShippingOption>
<Description>string</Description>
</RecurrenceShippingOption>
<RecurrenceSpecialHandlingCharge>decimal</RecurrenceSpecialHandlingCharge>
<NumberRecurrence>int</NumberRecurrence>
</OrderRecurrenceSchedule>
<OrderBudget>
<Person>
<Name xsi:nil="true" />
<CompanyInfo xsi:nil="true" />
<Address xsi:nil="true" />
<ContactInfo xsi:nil="true" />
<BillingInfo xsi:nil="true" />
<Variables xsi:nil="true" />
</Person>
</OrderBudget>
</order>
</AddOrder>
</soap:Body>
</soap:Envelope>
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<DebugHeader xmlns="http://sma-promail/">
<Debug>boolean</Debug>
<Request>string</Request>
</DebugHeader>
</soap:Header>
<soap:Body>
<AddOrderResponse xmlns="http://sma-promail/">
<AddOrderResult>
<OrderSeqID>int</OrderSeqID>
<OrderID>string</OrderID>
</AddOrderResult>
</AddOrderResponse>
</soap:Body>
</soap:Envelope>
Speculation thus far, but assuming all the headers are set up properly, the one thing that stands out is the content-type
header - you've got the type and charset split into multiple key:value pairs; it should be on a single line:
var newOrder = buildOrder(orderInfo);
var soapOptions = {
uri: 'http://myserver.com/oms/order.asmx',
headers: {
'Content-Type': 'text/xml; charset=utf-8',
'Content-Length': newOrder.length.toString(),
'SOAPAction': 'http://shipping_software/AddOrder',
'Host': 'myserver.com',
'Connection': 'keep-alive'
},
method: 'POST',
body: newOrder //New order is properly formed xml as a String
}
request(soapOptions, function(err, response) {
console.log(err);
console.log(response);
})
// console.log(newOrder);
});
Also, as you stated in your question, make sure uri
is a fully qualified URL, not just the path suffix.
It goes slightly off topic from the post title, but I ended up just going with node http:
var newOrder = "<?xml version='1.0' encoding='utf-8'?><soap:Envelope><soap:Header>.....</soap:Envelope>"
var postOptions = {
hostname: 'server.com',
port: 80,
path: '/oms/order.asmx?wsdl',
method: 'POST',
headers: {
'Host':'server.com',
'Content-Type':'text/xml;charset=utf-8',
'Content-Length':newOrder.length,
'SOAPAction':"http://sma-promail/AddOrder",
}
};
var req = http.request(postOptions, function(res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
});
req.on('error', function(e) {
console.log('problem with request: ' + e.message);
});
// write data to request body
req.write(newOrder);
req.end();
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With