• Mark Mulholland 3
  • NEWBIE
  • 50 Points
  • Member since 2016

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 6
    Questions
  • 9
    Replies
Hello,

I can see there is a REST API that can be called so we can see where we are currently with all of the Salesforce limits. https://instance.salesforce.com/services/data/v37.0/limits/

We would like to be able to track the limits periodically using a trigger. Inside this trigger we would like to view the Daily Async Apex Executions, and do something if the number left is below a threshold

The only method that I can see of grabbing this number real time is with that REST API. Is there another way to grab that number? e.g. is there an object that I can query using SOQL? Alternatively, am I wrong in thinking it's impossible to grab the results from that REST API in a trigger?

I have searched for all resources on the topic and have come up blank. If someone could shine a light on this it would be greatly appreciated

Thanks
Mark
Hello

We are using a 3rd party to create eDocuments, and we would like to be able to store credentials for these documents in Salesforce.

I have created a REST API that accepts the json we will be expecting. However I have never set up a connection like this with a 3rd party before. All of the options I have found when searching is to do with fully integrating with a 3rd party and allowing users to login to that site. In my case I just want to make it so this 3rd party can send json via an API call.

I know this will require authorisation like OAuth, but I have no idea where to start. Could someone point me in the right direction please

Mark
Hello,

I have a REST API class with a GET method which finds contacts based on 2 fields that can be passed in the URI. The class itself works when I test it in the Workbench so that doesn't seem to be an issue.

I have created a test class for this and the system.assertequals methods I try keep returning null values, as if the URI is formatted incorrectly. I have checked and rechecked the URI I have used and it should work. I have also checked that the test records I have in the test class are getting created and they are

Can one of you have a look at my test class and see if you can spot what I am missing please. Also I understand that the test class is very basic at the moment, once I fix this issue I will be able to make it more robust


Test Class:
@istest private class REST_API_IATA_and_Email_v1_Tests {

    //Declare variables for records that will be used
    private static Account Agency1;
    
    private static Contact Agency1Contact1;
    
    public static void createRecords(){
        
        //get Account record Types
        map<string, id> mapRT = new map<string, id>();
        for(RecordType RT : [SELECT id, DeveloperName, Name, SobjectType FROM RecordType WHERE SobjectType = 'Account']){
            mapRT.put(RT.DeveloperName, RT.id);
        }

        //get Contact record Types
        map<string, id> ConRT = new map<string, id>();
        for(RecordType RT : [SELECT id, DeveloperName, Name, SobjectType FROM RecordType WHERE SobjectType = 'Contact']){
            ConRT.put(RT.DeveloperName, RT.id);
        }
        
        //insert Accounts to be used in test
        Agency1 = new Account(Name = 'Agency Account 1', IATA_Code__c = '12345678', RecordTypeId = mapRT.get('Agency'));
        insert Agency1;
        
        
        //insert Contacts to be used in test
        Agency1Contact1 = new Contact(AccountId = Agency1.id, firstName = 'Account1', lastName = 'Contact1', email = 'alex.drew@ttc2.com', RecordTypeId = conRT.get('Travel_Consultant'));
        insert Agency1Contact1;   
    }
    
    @isTest
    //perform first doGet() call
    static void callAPIForTestResults(){
        
        //create records
        createRecords();
        
        test.startTest();
        
        RestRequest req = new RestRequest();
        RestResponse res = new RestResponse();
        
        //make the fake callout to trigger the Rest API
        req.requestURI = 'https://cs86.salesforce.com/services/apexrest/v1/contacts?Email=alex.drew@ttc2.com';
         
        req.httpMethod = 'GET';
        RestContext.request = req;
        RestContext.response = res;
        
        //call the GET method on the Rest API class and envolk the ContactWrapper list
        REST_API_IATA_and_Email_v1.ContactWrapper results = REST_API_IATA_and_Email_v1.doGet();
        
        system.assertEquals(1, results.acctList.size()); //check the GET method was successful with the URI it was given
        
        test.stopTest();
    }
}



REST API Class:
 
@RestResource(urlMapping='/v1/contacts/*')
global with sharing class REST_API_IATA_and_Email_v1 {
    
    @HttpGet
    global static ContactWrapper doGet() {
        RestRequest req = RestContext.request;
        RestResponse res = RestContext.response;
        ContactWrapper response = new ContactWrapper();
        
        String contactId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
        
        if(doSearch(contactId)) {
            searchContacts(req, res, response);
        }
        
        return response;
    }
    

    // If the item to the right of the last forward slash is "contacts", the request went to v1/contacts?Name=United
    // Else the request went to v1/contacts/<something>, which is not a search, but a specific entity
    private static boolean doSearch(String contactId) {
        if(contactId == 'contacts') {
            return true;
        }
        return false;
    }
    
    //If the request came to /v1/contacts, then we want to execute a search
    private static void searchContacts(RestRequest req, RestResponse res, ContactWrapper response) {

        //Use the RestRequest's params to fetch the IATA and Email parameters
        String searchTerm1 = req.params.get('IATA');
        String searchTerm2 = req.params.get('Email');
        
        if(searchTerm2 == null || searchTerm2 == ''){
        
            if(searchTerm1 == null || searchTerm1 == '') {
                response.status = 'Error';
                response.message = 'You must provide an IATA Code for your search term.';
                res.StatusCode = 400;
            }
            else {
                List<Contact> searchResults = [SELECT Id, Name, Phone, Email, Account.IATA_Code__c, Account.Name FROM Contact WHERE Account.IATA_Code__c = :searchTerm1];
                
                if(searchResults != null && searchResults.size() > 0) {
                    response.acctList = searchResults;
                    response.status = 'Success';
                    response.message = searchResults.size() + ' Contacts were found that matched your search term.';
                }
                else {
                    response.status = 'Error';
                    response.message = 'No Contacts where found based on that IATA Code, please search again.';
                }
            }
        }
        else if(searchTerm1 == null || searchTerm1 == ''){
        
            if(searchTerm2 == null || searchTerm2 == '') {
                response.status = 'Error';
                response.message = 'You must provide an Email for your search term.';
                res.StatusCode = 400;
            }
            else {
                List<Contact> searchResults = [SELECT Id, Name, Phone, Email, Account.IATA_Code__c, Account.Name FROM Contact WHERE Email = :searchTerm2];
                
                if(searchResults != null && searchResults.size() > 0) {
                    response.acctList = searchResults;
                    response.status = 'Success';
                    response.message = searchResults.size() + ' Contacts were found that matched your search term.';
                }
                else {
                    response.status = 'Error';
                    response.message = 'No Contacts where found based on that Email, please search again.';
                }
            }
        }    
        else{
        
                List<Contact> searchResults = [SELECT Id, Name, Phone, Email, Account.IATA_Code__c, Account.Name FROM Contact WHERE Account.IATA_Code__c = :searchTerm1 AND Email = :searchTerm2];
                
                if(searchResults != null && searchResults.size() > 0) {
                    response.acctList = searchResults;
                    response.status = 'Success';
                    response.message = searchResults.size() + ' Contacts were found that matched your search terms.';
                }
                else {
                    response.status = 'Error';
                    response.message = 'No Contacts where found based on that IATA Code and email, please search again.';
                }
            }
            
    }

    
    global class ContactWrapper {
        public List<Contact> acctList;
        public String status;
        public String message;
        
        public ContactWrapper(){
            acctList = new List<Contact>();
        }
    }
}



Thanks very much
If I have a variable of a SObject and I want to check a field on the parent record, how is that written?

I assumed it was in the format of "variable name"."lookup relationship name"."field name"
so if the variable is "Contact1" and I want to see the Account Name through that variable I would write
String AccountName = Contact1.Account.name;

If it's with custom objects then I would write it as
Passenger1.Account__r.name

If I try to do a system.assert on that then the string is returned as Null as if there is no relationship, but I have a feeling I am writing it wrong
I tried looking up the correct format but I could find no resource that has a variable, it's always in a SOQL query so it would just be Account__r.name

Can someone help please
Hello,

I am creating a test class for a Rest API class I have with a GET method.

The class itself is pretty simple, It looks for 1 or 2 values for specific objects, queries the database and returns contacts that meet the criteria.

When I run the test class I am getting the error "System.NullPointerException: Attempt to de-reference a null object" pointing at the line with the URI callout and I cannot figure out why.

The class itself is here:
 
@RestResource(urlMapping='/v1/contacts/*')
global with sharing class REST_API_IATA_and_Email_v1 {
    
    @HttpGet
    global static ContactWrapper doGet() {
        RestRequest req = RestContext.request;
        RestResponse res = RestContext.response;
        ContactWrapper response = new ContactWrapper();
        
        String contactId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
        
        if(doSearch(contactId)) {
            searchContacts(req, res, response);
        }
        
        return response;
    }
    

    // If the item to the right of the last forward slash is "contacts", the request went to v1/contacts?Name=United
    // Else the request went to v1/contacts/<something>, which is not a search, but a specific entity
    private static boolean doSearch(String contactId) {
        if(contactId == 'contacts') {
            return true;
        }
        return false;
    }
    
    //If the request came to /v1/contacts, then we want to execute a search
    private static void searchContacts(RestRequest req, RestResponse res, ContactWrapper response) {

        //Use the RestRequest's params to fetch the IATA and Email parameters
        String searchTerm1 = req.params.get('IATA');
        String searchTerm2 = req.params.get('Email');
        
        if(searchTerm2 == null || searchTerm2 == ''){
        
            if(searchTerm1 == null || searchTerm1 == '') {
                response.status = 'Error';
                response.message = 'You must provide an IATA Code for your search term.';
                res.StatusCode = 400;
            }
            else {
                String searchText = '%'+searchTerm1+'%';
                List<Contact> searchResults = [SELECT Id, Name, Phone, Email, Account.IATA_Code__c, Account.Name FROM Contact WHERE Account.IATA_Code__c = :searchTerm1];
                
                if(searchResults != null && searchResults.size() > 0) {
                    response.acctList = searchResults;
                    response.status = 'Success';
                    response.message = searchResults.size() + ' Contacts were found that matched your search term.';
                }
                else {
                    response.status = 'Error';
                    response.message = 'No Contacts where found based on that IATA Code, please search again.';
                }
            }
        }
        else if(searchTerm1 == null || searchTerm1 == ''){
        
            if(searchTerm2 == null || searchTerm2 == '') {
                response.status = 'Error';
                response.message = 'You must provide an Email for your search term.';
                res.StatusCode = 400;
            }
            else {
                String searchText = '%'+searchTerm2+'%';
                List<Contact> searchResults = [SELECT Id, Name, Phone, Email, Account.IATA_Code__c, Account.Name FROM Contact WHERE Email = :searchTerm2];
                
                if(searchResults != null && searchResults.size() > 0) {
                    response.acctList = searchResults;
                    response.status = 'Success';
                    response.message = searchResults.size() + ' Contacts were found that matched your search term.';
                }
                else {
                    response.status = 'Error';
                    response.message = 'No Contacts where found based on that Email, please search again.';
                }
            }
        }    
        else{
        
            String searchText1 = '%'+searchTerm1+'%';
            String searchText2 = '%'+searchTerm2+'%';
                List<Contact> searchResults = [SELECT Id, Name, Phone, Email, Account.IATA_Code__c, Account.Name FROM Contact WHERE Account.IATA_Code__c = :searchTerm1 AND Email = :searchTerm2];
                
                if(searchResults != null && searchResults.size() > 0) {
                    response.acctList = searchResults;
                    response.status = 'Success';
                    response.message = searchResults.size() + ' Contacts were found that matched your search terms.';
                }
                else {
                    response.status = 'Error';
                    response.message = 'No Contacts where found based on that IATA Code and email, please search again.';
                }
            }
            
    }

    
    global class ContactWrapper {
        public List<Contact> acctList;
        public String status;
        public String message;
        
        public ContactWrapper(){
            acctList = new List<Contact>();
        }
    }
}

It's a bit long but mostly taken up by an IF statement checking how many and which variables were passed in the URI

The test class I have created is below
 
@istest private class REST_API_IATA_and_Email_v1_Tests {

    //Declare variables for records that will be used
    private static Account Agency1;
    
    private static Contact Agency1Contact1;
    
    public static void createRecords(){
        
        //get Account record Types
        map<string, id> mapRT = new map<string, id>();
        for(RecordType RT : [SELECT id, DeveloperName, Name, SobjectType FROM RecordType WHERE SobjectType = 'Account']){
            mapRT.put(RT.DeveloperName, RT.id);
        }

        //get Contact record Types
        map<string, id> ConRT = new map<string, id>();
        for(RecordType RT : [SELECT id, DeveloperName, Name, SobjectType FROM RecordType WHERE SobjectType = 'Contact']){
            ConRT.put(RT.DeveloperName, RT.id);
        }
        
        //insert Accounts to be used in test
        Agency1 = new Account(Name = 'Agency Account 1', IATA_Code__c = '12345678', RecordTypeId = mapRT.get('Agency'));
        insert Agency1;
        
        
        //insert Contacts to be used in test
        Agency1Contact1 = new Contact(firstName = 'Account1', lastName = 'Contact1', email = 'alex.drew@ttc2.com', RecordTypeId = conRT.get('Travel_Consultant'));
        insert Agency1Contact1;
        
         //There are more records, most have been removed to save space  
    }
    
    @isTest
    //perform first doGet() call
    static void callAPIForTestResults(){
        
        //create records
        createRecords();
        
        test.startTest();
        
        RestRequest req = RestContext.request;
        RestResponse res = RestContext.response;
        
        req.requestURI = 'https://XXXX.salesforce.com/services/apexrest/v1/contacts?IATA=12345678&email=alex.drew@ttc2.com';
         
        req.httpMethod = 'GET';
        RestContext.request = req;
        RestContext.response = res;
        
        REST_API_IATA_and_Email_v1.ContactWrapper results = REST_API_IATA_and_Email_v1.doGet();
        
        system.assertEquals('success', results.status);
        system.assertEquals(1, results.acctList.size());
        
        test.stopTest();
    }
}

As I said the error I am getting is "System.NullPointerException: Attempt to de-reference a null object" and pointing at the URI call but I cannot see any problems with it. Can anyone help please

Thanks
Hello all,

I am trying to create a simple query against Accounts and Contacts, trying to see if a contact has a selected Email address and the parent Account has a specific IATA number. I am getting into some basic API creation and am using files from a Developerforce conference from 2 years ago. I modified the code to use field specific to my org

The SOQL query returns values only if I use the LIKE operator and doesn't return any results if I use the equals operator. See below for what I mean
 
String searchText = '%'+searchTerm1+'%';
                List<Contact> searchResults = [SELECT Id, Name, Phone, Email, Account.IATA_Code__c FROM Contact WHERE Account.IATA_Code__c LIKE :searchText];
                
                if(searchResults != null && searchResults.size() > 0) {
                    response.acctList = searchResults;
                    response.status = 'Success';
                    response.message = searchResults.size() + ' Contacts were found that matched your search term.';
                }
                else {
                    response.status = 'Error';
                    response.message = 'No Contacts where found based on that IATA Code, please search again.';
                }

Because I used LIKE in the SOQL query I get results returned. However if I modify the code as you can see in the next fragment I get no results
 
String searchText = '%'+searchTerm1+'%';
                List<Contact> searchResults = [SELECT Id, Name, Phone, Email, Account.IATA_Code__c FROM Contact WHERE Account.IATA_Code__c = :searchText];
                
                if(searchResults != null && searchResults.size() > 0) {
                    response.acctList = searchResults;
                    response.status = 'Success';
                    response.message = searchResults.size() + ' Contacts were found that matched your search term.';
                }
                else {
                    response.status = 'Error';
                    response.message = 'No Contacts where found based on that IATA Code, please search again.';
                }

However, if you do not use a List for the results and simply use a String, then you can use the equals operator.

Is this expected behaviour? and if so is there any way I can made the search more selective? or make it pseudo equals?

Thanks
Hello,

I can see there is a REST API that can be called so we can see where we are currently with all of the Salesforce limits. https://instance.salesforce.com/services/data/v37.0/limits/

We would like to be able to track the limits periodically using a trigger. Inside this trigger we would like to view the Daily Async Apex Executions, and do something if the number left is below a threshold

The only method that I can see of grabbing this number real time is with that REST API. Is there another way to grab that number? e.g. is there an object that I can query using SOQL? Alternatively, am I wrong in thinking it's impossible to grab the results from that REST API in a trigger?

I have searched for all resources on the topic and have come up blank. If someone could shine a light on this it would be greatly appreciated

Thanks
Mark
Hello,

I have a REST API class with a GET method which finds contacts based on 2 fields that can be passed in the URI. The class itself works when I test it in the Workbench so that doesn't seem to be an issue.

I have created a test class for this and the system.assertequals methods I try keep returning null values, as if the URI is formatted incorrectly. I have checked and rechecked the URI I have used and it should work. I have also checked that the test records I have in the test class are getting created and they are

Can one of you have a look at my test class and see if you can spot what I am missing please. Also I understand that the test class is very basic at the moment, once I fix this issue I will be able to make it more robust


Test Class:
@istest private class REST_API_IATA_and_Email_v1_Tests {

    //Declare variables for records that will be used
    private static Account Agency1;
    
    private static Contact Agency1Contact1;
    
    public static void createRecords(){
        
        //get Account record Types
        map<string, id> mapRT = new map<string, id>();
        for(RecordType RT : [SELECT id, DeveloperName, Name, SobjectType FROM RecordType WHERE SobjectType = 'Account']){
            mapRT.put(RT.DeveloperName, RT.id);
        }

        //get Contact record Types
        map<string, id> ConRT = new map<string, id>();
        for(RecordType RT : [SELECT id, DeveloperName, Name, SobjectType FROM RecordType WHERE SobjectType = 'Contact']){
            ConRT.put(RT.DeveloperName, RT.id);
        }
        
        //insert Accounts to be used in test
        Agency1 = new Account(Name = 'Agency Account 1', IATA_Code__c = '12345678', RecordTypeId = mapRT.get('Agency'));
        insert Agency1;
        
        
        //insert Contacts to be used in test
        Agency1Contact1 = new Contact(AccountId = Agency1.id, firstName = 'Account1', lastName = 'Contact1', email = 'alex.drew@ttc2.com', RecordTypeId = conRT.get('Travel_Consultant'));
        insert Agency1Contact1;   
    }
    
    @isTest
    //perform first doGet() call
    static void callAPIForTestResults(){
        
        //create records
        createRecords();
        
        test.startTest();
        
        RestRequest req = new RestRequest();
        RestResponse res = new RestResponse();
        
        //make the fake callout to trigger the Rest API
        req.requestURI = 'https://cs86.salesforce.com/services/apexrest/v1/contacts?Email=alex.drew@ttc2.com';
         
        req.httpMethod = 'GET';
        RestContext.request = req;
        RestContext.response = res;
        
        //call the GET method on the Rest API class and envolk the ContactWrapper list
        REST_API_IATA_and_Email_v1.ContactWrapper results = REST_API_IATA_and_Email_v1.doGet();
        
        system.assertEquals(1, results.acctList.size()); //check the GET method was successful with the URI it was given
        
        test.stopTest();
    }
}



REST API Class:
 
@RestResource(urlMapping='/v1/contacts/*')
global with sharing class REST_API_IATA_and_Email_v1 {
    
    @HttpGet
    global static ContactWrapper doGet() {
        RestRequest req = RestContext.request;
        RestResponse res = RestContext.response;
        ContactWrapper response = new ContactWrapper();
        
        String contactId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
        
        if(doSearch(contactId)) {
            searchContacts(req, res, response);
        }
        
        return response;
    }
    

    // If the item to the right of the last forward slash is "contacts", the request went to v1/contacts?Name=United
    // Else the request went to v1/contacts/<something>, which is not a search, but a specific entity
    private static boolean doSearch(String contactId) {
        if(contactId == 'contacts') {
            return true;
        }
        return false;
    }
    
    //If the request came to /v1/contacts, then we want to execute a search
    private static void searchContacts(RestRequest req, RestResponse res, ContactWrapper response) {

        //Use the RestRequest's params to fetch the IATA and Email parameters
        String searchTerm1 = req.params.get('IATA');
        String searchTerm2 = req.params.get('Email');
        
        if(searchTerm2 == null || searchTerm2 == ''){
        
            if(searchTerm1 == null || searchTerm1 == '') {
                response.status = 'Error';
                response.message = 'You must provide an IATA Code for your search term.';
                res.StatusCode = 400;
            }
            else {
                List<Contact> searchResults = [SELECT Id, Name, Phone, Email, Account.IATA_Code__c, Account.Name FROM Contact WHERE Account.IATA_Code__c = :searchTerm1];
                
                if(searchResults != null && searchResults.size() > 0) {
                    response.acctList = searchResults;
                    response.status = 'Success';
                    response.message = searchResults.size() + ' Contacts were found that matched your search term.';
                }
                else {
                    response.status = 'Error';
                    response.message = 'No Contacts where found based on that IATA Code, please search again.';
                }
            }
        }
        else if(searchTerm1 == null || searchTerm1 == ''){
        
            if(searchTerm2 == null || searchTerm2 == '') {
                response.status = 'Error';
                response.message = 'You must provide an Email for your search term.';
                res.StatusCode = 400;
            }
            else {
                List<Contact> searchResults = [SELECT Id, Name, Phone, Email, Account.IATA_Code__c, Account.Name FROM Contact WHERE Email = :searchTerm2];
                
                if(searchResults != null && searchResults.size() > 0) {
                    response.acctList = searchResults;
                    response.status = 'Success';
                    response.message = searchResults.size() + ' Contacts were found that matched your search term.';
                }
                else {
                    response.status = 'Error';
                    response.message = 'No Contacts where found based on that Email, please search again.';
                }
            }
        }    
        else{
        
                List<Contact> searchResults = [SELECT Id, Name, Phone, Email, Account.IATA_Code__c, Account.Name FROM Contact WHERE Account.IATA_Code__c = :searchTerm1 AND Email = :searchTerm2];
                
                if(searchResults != null && searchResults.size() > 0) {
                    response.acctList = searchResults;
                    response.status = 'Success';
                    response.message = searchResults.size() + ' Contacts were found that matched your search terms.';
                }
                else {
                    response.status = 'Error';
                    response.message = 'No Contacts where found based on that IATA Code and email, please search again.';
                }
            }
            
    }

    
    global class ContactWrapper {
        public List<Contact> acctList;
        public String status;
        public String message;
        
        public ContactWrapper(){
            acctList = new List<Contact>();
        }
    }
}



Thanks very much
If I have a variable of a SObject and I want to check a field on the parent record, how is that written?

I assumed it was in the format of "variable name"."lookup relationship name"."field name"
so if the variable is "Contact1" and I want to see the Account Name through that variable I would write
String AccountName = Contact1.Account.name;

If it's with custom objects then I would write it as
Passenger1.Account__r.name

If I try to do a system.assert on that then the string is returned as Null as if there is no relationship, but I have a feeling I am writing it wrong
I tried looking up the correct format but I could find no resource that has a variable, it's always in a SOQL query so it would just be Account__r.name

Can someone help please
Hello,

I am creating a test class for a Rest API class I have with a GET method.

The class itself is pretty simple, It looks for 1 or 2 values for specific objects, queries the database and returns contacts that meet the criteria.

When I run the test class I am getting the error "System.NullPointerException: Attempt to de-reference a null object" pointing at the line with the URI callout and I cannot figure out why.

The class itself is here:
 
@RestResource(urlMapping='/v1/contacts/*')
global with sharing class REST_API_IATA_and_Email_v1 {
    
    @HttpGet
    global static ContactWrapper doGet() {
        RestRequest req = RestContext.request;
        RestResponse res = RestContext.response;
        ContactWrapper response = new ContactWrapper();
        
        String contactId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
        
        if(doSearch(contactId)) {
            searchContacts(req, res, response);
        }
        
        return response;
    }
    

    // If the item to the right of the last forward slash is "contacts", the request went to v1/contacts?Name=United
    // Else the request went to v1/contacts/<something>, which is not a search, but a specific entity
    private static boolean doSearch(String contactId) {
        if(contactId == 'contacts') {
            return true;
        }
        return false;
    }
    
    //If the request came to /v1/contacts, then we want to execute a search
    private static void searchContacts(RestRequest req, RestResponse res, ContactWrapper response) {

        //Use the RestRequest's params to fetch the IATA and Email parameters
        String searchTerm1 = req.params.get('IATA');
        String searchTerm2 = req.params.get('Email');
        
        if(searchTerm2 == null || searchTerm2 == ''){
        
            if(searchTerm1 == null || searchTerm1 == '') {
                response.status = 'Error';
                response.message = 'You must provide an IATA Code for your search term.';
                res.StatusCode = 400;
            }
            else {
                String searchText = '%'+searchTerm1+'%';
                List<Contact> searchResults = [SELECT Id, Name, Phone, Email, Account.IATA_Code__c, Account.Name FROM Contact WHERE Account.IATA_Code__c = :searchTerm1];
                
                if(searchResults != null && searchResults.size() > 0) {
                    response.acctList = searchResults;
                    response.status = 'Success';
                    response.message = searchResults.size() + ' Contacts were found that matched your search term.';
                }
                else {
                    response.status = 'Error';
                    response.message = 'No Contacts where found based on that IATA Code, please search again.';
                }
            }
        }
        else if(searchTerm1 == null || searchTerm1 == ''){
        
            if(searchTerm2 == null || searchTerm2 == '') {
                response.status = 'Error';
                response.message = 'You must provide an Email for your search term.';
                res.StatusCode = 400;
            }
            else {
                String searchText = '%'+searchTerm2+'%';
                List<Contact> searchResults = [SELECT Id, Name, Phone, Email, Account.IATA_Code__c, Account.Name FROM Contact WHERE Email = :searchTerm2];
                
                if(searchResults != null && searchResults.size() > 0) {
                    response.acctList = searchResults;
                    response.status = 'Success';
                    response.message = searchResults.size() + ' Contacts were found that matched your search term.';
                }
                else {
                    response.status = 'Error';
                    response.message = 'No Contacts where found based on that Email, please search again.';
                }
            }
        }    
        else{
        
            String searchText1 = '%'+searchTerm1+'%';
            String searchText2 = '%'+searchTerm2+'%';
                List<Contact> searchResults = [SELECT Id, Name, Phone, Email, Account.IATA_Code__c, Account.Name FROM Contact WHERE Account.IATA_Code__c = :searchTerm1 AND Email = :searchTerm2];
                
                if(searchResults != null && searchResults.size() > 0) {
                    response.acctList = searchResults;
                    response.status = 'Success';
                    response.message = searchResults.size() + ' Contacts were found that matched your search terms.';
                }
                else {
                    response.status = 'Error';
                    response.message = 'No Contacts where found based on that IATA Code and email, please search again.';
                }
            }
            
    }

    
    global class ContactWrapper {
        public List<Contact> acctList;
        public String status;
        public String message;
        
        public ContactWrapper(){
            acctList = new List<Contact>();
        }
    }
}

It's a bit long but mostly taken up by an IF statement checking how many and which variables were passed in the URI

The test class I have created is below
 
@istest private class REST_API_IATA_and_Email_v1_Tests {

    //Declare variables for records that will be used
    private static Account Agency1;
    
    private static Contact Agency1Contact1;
    
    public static void createRecords(){
        
        //get Account record Types
        map<string, id> mapRT = new map<string, id>();
        for(RecordType RT : [SELECT id, DeveloperName, Name, SobjectType FROM RecordType WHERE SobjectType = 'Account']){
            mapRT.put(RT.DeveloperName, RT.id);
        }

        //get Contact record Types
        map<string, id> ConRT = new map<string, id>();
        for(RecordType RT : [SELECT id, DeveloperName, Name, SobjectType FROM RecordType WHERE SobjectType = 'Contact']){
            ConRT.put(RT.DeveloperName, RT.id);
        }
        
        //insert Accounts to be used in test
        Agency1 = new Account(Name = 'Agency Account 1', IATA_Code__c = '12345678', RecordTypeId = mapRT.get('Agency'));
        insert Agency1;
        
        
        //insert Contacts to be used in test
        Agency1Contact1 = new Contact(firstName = 'Account1', lastName = 'Contact1', email = 'alex.drew@ttc2.com', RecordTypeId = conRT.get('Travel_Consultant'));
        insert Agency1Contact1;
        
         //There are more records, most have been removed to save space  
    }
    
    @isTest
    //perform first doGet() call
    static void callAPIForTestResults(){
        
        //create records
        createRecords();
        
        test.startTest();
        
        RestRequest req = RestContext.request;
        RestResponse res = RestContext.response;
        
        req.requestURI = 'https://XXXX.salesforce.com/services/apexrest/v1/contacts?IATA=12345678&email=alex.drew@ttc2.com';
         
        req.httpMethod = 'GET';
        RestContext.request = req;
        RestContext.response = res;
        
        REST_API_IATA_and_Email_v1.ContactWrapper results = REST_API_IATA_and_Email_v1.doGet();
        
        system.assertEquals('success', results.status);
        system.assertEquals(1, results.acctList.size());
        
        test.stopTest();
    }
}

As I said the error I am getting is "System.NullPointerException: Attempt to de-reference a null object" and pointing at the URI call but I cannot see any problems with it. Can anyone help please

Thanks
Hello all,

I am trying to create a simple query against Accounts and Contacts, trying to see if a contact has a selected Email address and the parent Account has a specific IATA number. I am getting into some basic API creation and am using files from a Developerforce conference from 2 years ago. I modified the code to use field specific to my org

The SOQL query returns values only if I use the LIKE operator and doesn't return any results if I use the equals operator. See below for what I mean
 
String searchText = '%'+searchTerm1+'%';
                List<Contact> searchResults = [SELECT Id, Name, Phone, Email, Account.IATA_Code__c FROM Contact WHERE Account.IATA_Code__c LIKE :searchText];
                
                if(searchResults != null && searchResults.size() > 0) {
                    response.acctList = searchResults;
                    response.status = 'Success';
                    response.message = searchResults.size() + ' Contacts were found that matched your search term.';
                }
                else {
                    response.status = 'Error';
                    response.message = 'No Contacts where found based on that IATA Code, please search again.';
                }

Because I used LIKE in the SOQL query I get results returned. However if I modify the code as you can see in the next fragment I get no results
 
String searchText = '%'+searchTerm1+'%';
                List<Contact> searchResults = [SELECT Id, Name, Phone, Email, Account.IATA_Code__c FROM Contact WHERE Account.IATA_Code__c = :searchText];
                
                if(searchResults != null && searchResults.size() > 0) {
                    response.acctList = searchResults;
                    response.status = 'Success';
                    response.message = searchResults.size() + ' Contacts were found that matched your search term.';
                }
                else {
                    response.status = 'Error';
                    response.message = 'No Contacts where found based on that IATA Code, please search again.';
                }

However, if you do not use a List for the results and simply use a String, then you can use the equals operator.

Is this expected behaviour? and if so is there any way I can made the search more selective? or make it pseudo equals?

Thanks