I have seen multiple posts online talking about how to read in XML data from a web request using HttpRequest, but I cannot seem to make it work or find any documentation on it. The closest I have gotten is to making it work is to enclose the xml in

< request >....< /request >

which is not acceptable for my case.

Is there anyway to send a raw string of xml to salesforce for manual parsing and not having to alter or encapsulate that string?


    < B:Envelope xmlns:B="http://schemas.xmlsoap.org/soap/envelope/" xmlns:A="theircustomuri" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       < SOAP:Header xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-SEC="http://schemas.xmlsoap.org/soap/security/2000-12">
          < SOAP-SEC:Signature SOAP:mustUnderstand="1">
             < Signature xmlns="http://www.w3.org/2000/09/xmldsig#" xmlns:C="theircustomuri" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/07/secext">
                < SignedInfo>
                   < CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                   < SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
                   < Reference URI="#Body">
                      < Transforms>
                         < Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                      < /Transforms>
                      < DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                      < DigestValue>xxxxxxxxxxxxxxxxx< /DigestValue>
                   < /Reference>
                < /SignedInfo>
                < SignatureValue>xxxxxxxxxxxxxxxxx< /SignatureValue>
                < KeyInfo>
                   < X509Data>
                      < X509Certificate />
                      < X509IssuerSerial>
                         < X509IssuerName>Oxxxxxxxxxxxxxxxxxxx< /X509IssuerName>
                         < X509SerialNumber>xxxxxxxxxxxxxxxxx< /X509SerialNumber>
                      < /X509IssuerSerial>
                   < /X509Data>
                < /KeyInfo>
             < /Signature>
          < /SOAP-SEC:Signature>
       < /SOAP:Header>
       < B:Body id="Body">
          < B:Fault>
             < B:faultcode>Client.invalidData< /B:faultcode>
             < B:faultstring>invalidData< /B:faultstring>
             < B:detail>
                < faultdetails>detailed info< /faultdetails>
             < /B:detail>
          < /B:Fault>
          < A:AdditionalInfo version="2.0">
             < A:SenderID>FS000< /A:SenderID>
             < A:TargetID>F000BK< /A:TargetID>
          < /A:AdditionalInfo>
       < /B:Body>
    < /B:Envelope>
  • 1
    Are you making a call out from Salesforce, or is someone else making a call in to Salesforce? Is the service REST or SOAP-based (you've tagged both)? Can you give a concrete example of the issue you're confronting? – David Reed Jan 26 '19 at 17:38
  • We'd have to see a sample of what you're trying to parse to know exactly what's wrong. – sfdcfox Jan 26 '19 at 17:51
  • Yes, this is a callout into Salesforce that should be SOAP, but it doesn't meet Salesforce's standards for a soap message. One of the things would be having a custom namespace on the body data instead of the "soap.sforce.com/schemas/class....." So I keep reading about people using custom rest services in salesforce to create a listener to manually parse the data, but i have been stuck for months. – awh01 Jan 26 '19 at 17:53
  • 1
    @awh01 Are those tags literally < B:Body> with the leading whitespace? That wouldn't be valid XML. When I fix the whitespace issue, the XML parses just fine. – sfdcfox Jan 26 '19 at 18:32
  • @sfdcfox No, there is no leading whitespace. The tags weren't showing in the code block when I didn't have the whitespace (I'm not aware of the escape character for xml in this codeblock) Are you using rest or soap? – awh01 Jan 26 '19 at 19:56

The answer to this is as @sfdcfox suggested. You can just create a rest endpoint without parameters (so salesforce doesn't try to automatically deserialize).

global static String doPost() {
    String soapRequestBody = RestContext.request.requestBody.toString();
    RestResponse res = RestContext.response;
    res.statusCode = 200;
    res.responseBody = Blob.valueOf('OK');
    return 'OK';
| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.