How to handle multiple HTTP Methods in the same Salesforce REST Apex class?

How to handle multiple HTTP Methods in the same Salesforce REST Apex class?

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:

Leave a Reply