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