function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
snowMonkeysnowMonkey 

calling WS with a HTTP request

Totally new to SFDC and apex...sorry! :)

 

writing a class to call the simplest WS thru apex and not able to get the request to the ws properly. Can anyone help pls.

 

The erroR is a generic 500 error

 

16:44:46:211 USER_DEBUG [49]|DEBUG|System.HttpResponse[Status=Internal Server Error, StatusCode=500]

 

public with sharing class Integration {

@future (callout=true) 
public static void postOrder(string as1 , String as2) {
	
    httpRequest req = new httpRequest();
    string mycardType = 'Visa';
    string mycardNumber = '1111111111111111';
    
    req.setEndpoint('http://www.webservicex.net/CreditCard.asmx');
    req.setMethod('POST');
    //req.setHeader('Host', 'http://www.webservicex.net');
    //req.setHeader('Content-Type', 'text/xml; charset=utf-8');
    //req.setHeader('Content-Type', 'application/x-www-form-urlencoded');
    
    //req.setHeader('SOAPAction', 'http://www.webservicex.net/ValidateCardNumber');
    
    /*
    string b = '<?xml version="1.0" encoding="utf-8"?>';
    b += '<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/">';
    b += '<soap:Body>';
    b += '<ValidateCardNumber xmlns="http://www.webservicex.net">';
    b += '<CardType>' + cardType + '</CardType>';
    b += '<CardNumber>' + cardNumber + '</CardNumber>';
    b += '</ValidateCardNumber>';
    b += '</soap:Body>';
    b += '</soap:Envelope>';
    */
    
    req.setBody('cardType='+EncodingUtil.urlEncode(mycardType, 'UTF-8')+'&cardNumber='+EncodingUtil.urlEncode(mycardNumber, 'UTF-8'));    
    //string b = 'cardType=' + mycardType + '&cardNumber=' + mycardNumber ;    
    //req.setBody(b);
    
    req.setCompressed(true);
    //System.debug('Full request: '+ b); 
    
    Http http = new Http(); 
    HTTPResponse res = http.send(req);
    system.debug(res.toString());
    
    System.debug('Response from CC Checking Engine: '+ res.getBody());
    XmlStreamReader reader = new XmlStreamReader(res.getBody());
    system.debug(reader.toString());
    if (res.getStatusCode() != 200) {
            System.debug('Error from ' + req.getEndpoint() + ' : ' +
            res.getStatusCode() + ' ' + res.getStatus());
        }
    else {
            //List<nanlabs__Invoice_Statement__c> invoiceStatements = [SELECT Id FROM Invoice_Statement__c WHERE Id IN :invoiceIds];
            List<nanlabs__Invoice_Statement__c> invoiceStatements = [SELECT Id FROM Invoice_Statement__c ];
    
            for(Invoice_Statement__c inv: invoiceStatements ) {
                string myCallback = reader.getAttributeValue(null, 'ValidateCardNumberResult');
                system.debug('Response is: [' + myCallback  + ']');
                inv.callback__c = myCallback;
                update inv;
            }
        }
}
}

 

Best Answer chosen by Admin (Salesforce Developers) 
snowMonkeysnowMonkey

Got it working thru POST. How can debug and step thru code in Eclipse Apex? How can i browse data in the tables? are there better ways to parse XMLs thru apex since there are governer limits imposed(i dont even how many are there)?

 

For the benefit of others(i know this aint much:), but here is the code..

 

public with sharing class Integration {

@future (callout=true) 
public static void postOrder(string as1 , String as2) {	
    httpRequest req = new httpRequest();
    string mycardType = 'Visa';
    string mycardNumber = '1111111111111111';
    req.setEndpoint('http://www.webservicex.net/CreditCard.asmx/ValidateCardNumber' );
    req.setMethod('POST');   
    req.setHeader('Content-Type', 'application/x-www-form-urlencoded');
    req.setHeader('Content-Length','2004');
    string b = 'cardType=' + mycardType + '&cardNumber=' + mycardNumber ;    
    req.setBody(b);

    Http http = new Http(); 
    HTTPResponse res = http.send(req);
    system.debug(res.toString());
    system.debug('Response from CC Checking Engine: '+ res.getBody());

    if (res.getStatusCode() != 200) {
            system.debug('Error from ' + req.getEndpoint() + ' : ' +
            res.getStatusCode() + ' ' + res.getStatus());
        }
    else {
    	
    		XmlStreamReader reader = new XmlStreamReader(res.getBody());
            List<nanlabs__Invoice_Statement__c> invoiceStatements = [SELECT Id FROM Invoice_Statement__c ];
    
            for(Invoice_Statement__c inv: invoiceStatements ) {            	
	          	while(reader.hasNext()) {
	          		if ((reader.getEventType() == XmlTag.START_ELEMENT) && ('string' == reader.getLocalName())) {
			         		reader.next(); 
			         		inv.nanlabs__Callback__c = reader.getText();
			                update inv;
	          		}
			        else if (reader.getEventType() == XmlTag.END_ELEMENT) {
			               	break;
			        }			            
			    reader.next(); 
			    }
	        }
         }
}
}

 

Thanks much!

 

 

All Answers

SuperfellSuperfell

many services don't accept compressed requests, start by removing the call to enable compression. You should also dump the response body in the case of an error that will typically have more info.

snowMonkeysnowMonkey

Got it working thru POST. How can debug and step thru code in Eclipse Apex? How can i browse data in the tables? are there better ways to parse XMLs thru apex since there are governer limits imposed(i dont even how many are there)?

 

For the benefit of others(i know this aint much:), but here is the code..

 

public with sharing class Integration {

@future (callout=true) 
public static void postOrder(string as1 , String as2) {	
    httpRequest req = new httpRequest();
    string mycardType = 'Visa';
    string mycardNumber = '1111111111111111';
    req.setEndpoint('http://www.webservicex.net/CreditCard.asmx/ValidateCardNumber' );
    req.setMethod('POST');   
    req.setHeader('Content-Type', 'application/x-www-form-urlencoded');
    req.setHeader('Content-Length','2004');
    string b = 'cardType=' + mycardType + '&cardNumber=' + mycardNumber ;    
    req.setBody(b);

    Http http = new Http(); 
    HTTPResponse res = http.send(req);
    system.debug(res.toString());
    system.debug('Response from CC Checking Engine: '+ res.getBody());

    if (res.getStatusCode() != 200) {
            system.debug('Error from ' + req.getEndpoint() + ' : ' +
            res.getStatusCode() + ' ' + res.getStatus());
        }
    else {
    	
    		XmlStreamReader reader = new XmlStreamReader(res.getBody());
            List<nanlabs__Invoice_Statement__c> invoiceStatements = [SELECT Id FROM Invoice_Statement__c ];
    
            for(Invoice_Statement__c inv: invoiceStatements ) {            	
	          	while(reader.hasNext()) {
	          		if ((reader.getEventType() == XmlTag.START_ELEMENT) && ('string' == reader.getLocalName())) {
			         		reader.next(); 
			         		inv.nanlabs__Callback__c = reader.getText();
			                update inv;
	          		}
			        else if (reader.getEventType() == XmlTag.END_ELEMENT) {
			               	break;
			        }			            
			    reader.next(); 
			    }
	        }
         }
}
}

 

Thanks much!

 

 

This was selected as the best answer