[SalesForce] Setting up a Public REST API

I found a different question asking, "Can I have a public APEX REST API?" which led to a blog post explaining how to setup a public site to expose a REST API:

  1. Create your REST API in Apex as normal
  2. Create a public site
  3. Configure the public user to have access to the Apex class and any other sObjects

I followed the directions and have a publicly available site, but when I do a GET to the URL the site returns a HTTP 503 error page. My understanding is that shouldn't even be routed through the VF handler.

Webservice code:

@RestResource(urlMapping='/helloWorld/*')
global class RestWebservice {

  @HttpGet
  global static String helloWorld(){
    return 'HelloWorld';
  }

}

URL being queried: https://chale1-developer-edition.na14.force.com/services/apexrest/helloWorld

I have tried:

  • Turning on debug logs for the public site user, but that didn't help as no logs recorded the error.
  • Verified no redirects are configured
  • With and without a header for Accept: application/json
  • Tried on two different dev orgs, on different instances

Answers to questions:

  • I have not built any apps in this org, nor are there any installed packages, so there are no namespaces
  • Trying /services/apexrest/helloWord/blah returned the same response
  • Most of the raw response is just HTML. The headers have content-type of text/html, X-Powered-By: Salesforce.com ApexPages, P3P: CP="CUR OTR STA", cache-control, and nothing else of note

Eventually I would like to have a webhook use this API which is why it needs to be public. What else could cause the service to return a 503?

Best Answer

You are using the wrong URL I think

Try this: https://chale1-developer-edition.na14.force.com/test/services/apexrest/helloWorld

EDIT - When I looked at the HTML that came back original URL in Postman, I saw this message:

https://chale1-developer-edition.na14.force.com/test</i> is down for maintenance

So I realized he must have used added a suffix to the Default Web Address in the Site called test. The REST URL includes the default suffix as part of the full URL, so I added that the URL he provided, and it worked...