We cannot define the same HTTP Method multiple times in the same Apex REST Class. We get the following exception when we try to use the same HTTP Method multiple times
Only one method per type can be defined with: HttpGet
Use * in the urlMapping so that we can make use of different paths to handle multiple HTTP Methods in the same Salesforce REST Apex class.
Sample Apex Code:
@RestResource( urlMapping='/RecordFinder/V1/*' )
global with sharing class RESTAPIController {
@HttpGet
global static void doGet() {
switch on RestContext.request.requestURI.substringAfterLast( '/' ) {
when 'CheckAccountAvailability' {
verifyExistingAccount();
} when 'CheckContactAvailability' {
verifyExistingContact();
} when else {
String strResponse;
Map < String, String > mapResponse = new Map < String, String >();
mapResponse.put(
'errorMessage',
'Please check the endpoint URL and Path'
);
strResponse = JSON.serialize(
mapResponse
);
RestContext.response.addHeader(
'Content-Type',
'application/json'
);
RestContext.response.responseBody = Blob.valueOf(
strResponse
);
}
}
}
static void verifyExistingAccount() {
RestRequest req = RestContext.request;
String strResponse;
Map < String, String > mapResponse = new Map < String, String >();
String strAcctName = req.params.containsKey( 'AccountName' ) ?
req.params.get( 'AccountName' ) :
null;
if ( String.isNotBlank( strAcctName ) ) {
List < Account > listAccounts = [
SELECT Id, Name, Industry
FROM Account
WHERE Name =: strAcctName
];
if ( listAccounts.size() > 0 ) {
Account objAccount = listAccounts.get( 0 );
mapResponse.put(
'accountIndustry',
objAccount.Industry
);
mapResponse.put(
'accountName',
objAccount.Name
);
mapResponse.put(
'accountId',
objAccount.Id
);
System.debug(
'Response is ' +
JSON.serialize(
mapResponse
)
);
} else {
mapResponse.put(
'errorMessage',
'Account for this Name is not available'
);
}
} else {
mapResponse.put(
'errorMessage',
'Please pass Account Name to search'
);
}
strResponse = JSON.serialize(
mapResponse
);
RestContext.response.addHeader(
'Content-Type',
'application/json'
);
RestContext.response.responseBody = Blob.valueOf(
strResponse
);
}
static void verifyExistingContact() {
RestRequest req = RestContext.request;
String strResponse;
Map < String, String > mapResponse = new Map < String, String >();
String strEmail = req.params.containsKey( 'ContactEmail' ) ?
req.params.get( 'ContactEmail' ) :
null;
if ( String.isNotBlank( strEmail ) ) {
List < Contact > listContacts = [
SELECT Id, Account.Name, Email, AccountId,
FirstName, LastName
FROM Contact
WHERE Email =: strEmail
];
if ( listContacts.size() > 0 ) {
Contact objContact = listContacts.get( 0 );
mapResponse.put(
'email',
objContact.Email
);
mapResponse.put(
'contactId',
objContact.Id
);
mapResponse.put(
'contactLastName',
objContact.LastName
);
mapResponse.put(
'contactFirstName',
objContact.FirstName
);
mapResponse.put(
'accountId',
objContact.AccountId
);
mapResponse.put(
'accountName',
objContact.Account.Name
);
} else {
mapResponse.put(
'errorMessage',
'Contact for this email is not available'
);
}
} else {
mapResponse.put(
'errorMessage',
'Please pass Email to search'
);
}
strResponse = JSON.serialize(
mapResponse
);
RestContext.response.addHeader(
'Content-Type',
'application/json'
);
RestContext.response.responseBody = Blob.valueOf(
strResponse
);
}
}
Output: