I'm getting an error message when triggering the SOAP call from the UI via record update:
System.CalloutException: IO Exception: External server did not return any content
When I import the WSDL into SOAP UI and send the same package body, I receive this message:
HTTP /1.1 500
Server: Cowboy
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 10 Jul 2017 17:58:08 GMT
Via: 1.1 vegur
Proxy-Connection: Keep-Alive
Connection: Keep-Alive
Does this mean that the herokuapp needs to be restarted or something? Even when i was getting trained on Salesforce also this topic was not discussed in detailed. I've found a couple of posts with sample code for this challenge and with a few small differences, mine matches from what I can tell. Here's the code I'm using:
ProjectTrigger
trigger ProjectTrigger on Project__c (after update) { //Call the Billing Service callout logic here if (trigger.isAfter && trigger.isUpdate) { BillingCalloutService.callBillingService(Trigger.new, Trigger.newMap, Trigger.old, Trigger.oldMap); } }
BillingCalloutService
public class BillingCalloutService { //Implement business and callout logic methods here public static void callBillingService(List<Project__c> newList, Map<Id, Project__c> newMap, List<Project__c> oldList, Map<Id, Project__c> oldMap) { if(!newList.isEmpty()) { Project__c project = newList[0]; if (project.Status__c == 'Billable' && oldMap.get(project.Id).Status__c != 'Billable') { // Get Service Credentials from custom settings ServiceCredentials__c credentials = ServiceCredentials__c.getInstance('BillingServiceCredential'); billProject(project.ProjectRef__c, project.Billable_Amount__c, credentials.Username__c, credentials.Password__c); } } } @Future(callout=true) private static void billProject(String projectRef, Decimal billAmount, String username, String password) { BillingServiceProxy.project project = new BillingServiceProxy.project(); project.projectRef = projectRef; project.billAmount = billAmount; project.username = username; project.password = password; BillingServiceProxy.InvoicesPortSoap11 invoiceCall = new BillingServiceProxy.InvoicesPortSoap11(); // Make the callout and update the Status if callout is successful String response = invoiceCall.billProject(project); List<Project__c> projects = new List<Project__c>(); if(response != null && response.equalsIgnoreCase('OK')) { projects = [ Select Id, Status__c From Project__c Where ProjectRef__c = :projectRef ]; if(!projects.isEmpty()) { projects[0].Status__c = 'Billed'; update projects; } } } }
BillingServiceProxy
//Generated by wsdl2apex public class BillingServiceProxy { public class billProjectRequest_element { public BillingServiceProxy.project project; private String[] project_type_info = new String[]{'project','http://salesforce.com/th/invoice-web-service',null,'1','1','false'}; private String[] apex_schema_type_info = new String[]{'http://salesforce.com/th/invoice-web-service','true','false'}; private String[] field_order_type_info = new String[]{'project'}; } public class project { public String username; public String password; public String projectRef; public Double billAmount; private String[] username_type_info = new String[]{'username','http://salesforce.com/th/invoice-web-service',null,'1','1','false'}; private String[] password_type_info = new String[]{'password','http://salesforce.com/th/invoice-web-service',null,'1','1','false'}; private String[] projectRef_type_info = new String[]{'projectRef','http://salesforce.com/th/invoice-web-service',null,'1','1','false'}; private String[] billAmount_type_info = new String[]{'billAmount','http://salesforce.com/th/invoice-web-service',null,'1','1','false'}; private String[] apex_schema_type_info = new String[]{'http://salesforce.com/th/invoice-web-service','true','false'}; private String[] field_order_type_info = new String[]{'username','password','projectRef','billAmount'}; } public class billProjectResponse_element { public String status; private String[] status_type_info = new String[]{'status','http://salesforce.com/th/invoice-web-service',null,'1','1','false'}; private String[] apex_schema_type_info = new String[]{'http://salesforce.com/th/invoice-web-service','true','false'}; private String[] field_order_type_info = new String[]{'status'}; } public class InvoicesPortSoap11 { public String endpoint_x = 'http://sb-integration-bs.herokuapp.com:80/ws'; public Map<String,String> inputHttpHeaders_x; public Map<String,String> outputHttpHeaders_x; public String clientCertName_x; public String clientCert_x; public String clientCertPasswd_x; public Integer timeout_x; private String[] ns_map_type_info = new String[]{'http://salesforce.com/th/invoice-web-service', 'BillingServiceProxy'}; public String billProject(BillingServiceProxy.project project) { BillingServiceProxy.billProjectRequest_element request_x = new BillingServiceProxy.billProjectRequest_element(); request_x.project = project; BillingServiceProxy.billProjectResponse_element response_x; Map<String, BillingServiceProxy.billProjectResponse_element> response_map_x = new Map<String, BillingServiceProxy.billProjectResponse_element>(); response_map_x.put('response_x', response_x); WebServiceCallout.invoke( this, request_x, response_map_x, new String[]{endpoint_x, '', 'http://salesforce.com/th/invoice-web-service', 'billProjectRequest', 'http://salesforce.com/th/invoice-web-service', 'billProjectResponse', 'BillingServiceProxy.billProjectResponse_element'} ); response_x = response_map_x.get('response_x'); return response_x.status; } } }
Can you help me where i have done mistake?
Thanks!
05-03-2020 01:03 PM