Apex “No Operation Available Request” Web Service Errors!

Sometimes while working with Salesforce Web Service APIs, we get a “No Operation Available for Request” error. This error comes because the “Web service ENDPOINT URL” is not correct. In my case, this error came when I was trying to use “apex.wsdl” for executing Apex test cases via my Java code.

Here is the code sample that was failing for “No Operation Available For Request…/runTests”.

SoapBindingStub binding = (SoapBindingStub) new SforceServiceLocator()
		.getSoap();
LoginResult lr = binding.login(username, password);
binding._setProperty(SoapBindingStub.ENDPOINT_ADDRESS_PROPERTY, lr
		.getServerUrl());
SessionHeader sh = new SessionHeader();
sh.setSessionId(lr.getSessionId());
binding.setHeader(new SforceServiceLocator().getServiceName()
		.getNamespaceURI(), "SessionHeader", sh);
ApexBindingStub apexBinding = (ApexBindingStub) new ApexServiceLocator()
		.getApex();
/*
Line below was cause of problem, I was setting incorrect url for binding end point.
*/
apexBinding._setProperty(ApexBindingStub.ENDPOINT_ADDRESS_PROPERTY,
		lr.getServerUrl());

// Apex Session Header
com.sforce.soap._2006._08.apex.SessionHeader ash = new com.sforce.soap._2006._08.apex.SessionHeader();
ash.setSessionId(lr.getSessionId());
apexBinding.setHeader(new ApexServiceLocator().getServiceName()
		.getNamespaceURI(), "SessionHeader", ash);

RunTestsRequest runTestsRequest = new RunTestsRequest(false,
		new String[] { "TestFooBar" }, "myns", null);
RunTestsResult runTests = apexBinding.runTests(runTestsRequest);
System.out.println("Failures " + runTests.getNumFailures());

To make this work, I need to point the Apex Binding Stub endpoint to the correct URL.

Here is the fixed version:

/*
Metadata WSDL/ENDPOINT URL : https://[api node].salesforce.com/services/Soap/m/18.0/[org-id]
Partner WSDL/ENDPOINT URL : https://[api node].salesforce.com/services/Soap/u/18.0/[org-id]

Both these URLs can be fetched via LoginResult.getServerUrl() and LoginResult.getMetadataServerUrl(). But there is no direct method  for Apex WSDL URL. 
Though Apex WSDL/ENDPOINT URL is simply one char change
https://[api node].salesforce.com/services/Soap/s/18.0/[org-id]
So here is the trick, and the above code snippet will work fine then.
*/
apexBinding._setProperty(ApexBindingStub.ENDPOINT_ADDRESS_PROPERTY,
	lr.getServerUrl().replaceAll("/u/", "/s/"));

Let me know about any other such issues, especially with Enterprise WSDL; I haven’t tried it.

Abhinav Gupta

First Indian Salesforce MVP, rewarded Eight times in a row, has been blogging about Salesforce, Cloud, AI, & Web3 since 2011. Founded 1st Salesforce Dreamin event in India, called “Jaipur Dev Fest”. A seasoned speaker at Dreamforce, Dreamin events, & local meets. Author of many popular GitHub repos featured in official Salesforce blogs, newsletters, and books.

https://abhinav.fyi
Previous
Previous

Why WS-Client should RETRY Web Service Exceptions ?

Next
Next

Using System.runAs() for Too Many Query Rows 501 errors!