Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Forming a post to a SOAP api with npm request

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>
like image 405
goofiw Avatar asked Aug 21 '15 04:08

goofiw


2 Answers

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.

like image 151
brandonscript Avatar answered Sep 28 '22 18:09

brandonscript


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();
  });
like image 30
goofiw Avatar answered Sep 28 '22 16:09

goofiw