1

I am trying to build apex rest service which returns json/xml response . The api needs to support the below call

Sample Call:-

[API endpoint]/services.[format]

[API endpoint]/services/[service_code].[format]

Where format is json/xml

Here is my Issue when i call the service [API endpoint]/services it returns the correct result,but when i call the service

[API endpoint]/services.xml or [API endpoint]/services.json i get the below error

[{"errorCode":"NOT_FOUND","message":"The requested resource does not exist"}]

Can any one provide any pointers regarding the issue ?

Below is the apex rest service code:

@RestResource(urlMapping='/v2/services/*')
global with sharing class ServicesRestAPI_v2{

/*
    GET Service List / Get Service Definations

*/ 
@HttpGet
global static void getServices() {
     RestRequest req = RestContext.request; 
     RestResponse response = RestContext.response; 

     String format = req.requestURI.split('\\.').size()>1?req.requestURI.split('\\.')[1]:'';

     String responseStr;

     /*
      check to see whether jurisdiction_id is passed
     */
     String jId = req.params.get('jid');



     try{ 
         // see if a service code was  part of the URI
         String serviceCode= req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
         serviceCode = serviceCode.split('\\.').size()>1?serviceCode.split('\\.')[0]:serviceCode;          

         if (serviceCode!= '' && !serviceCode.startsWith('services')) {
              //we have the service code here  : this is always done only if metadat =true
              if(req.headers.get('Content-Type')==APIConstants.CONTENT_TYPE_JSON || format=='json')  
                responseStr= ServicesAPIResponse.sendJSONResponse(ServicesHelper.getService(serviceCode),ServicesHelper.getServiceMetadata(serviceCode)); 
              else
                responseStr= ServicesAPIResponse.sendXMLResponse(ServicesHelper.getService(serviceCode),ServicesHelper.getServiceMetadata(serviceCode)); 
         } else {                
              if(req.headers.get('Content-Type')==APIConstants.CONTENT_TYPE_JSON || format=='json') 
                responseStr= ServicesAPIResponse.sendJSONResponse(ServicesHelper.listAllServices(jId)); 
              else
                responseStr= ServicesAPIResponse.sendXMLResponse(ServicesHelper.listAllServices(jId));                 
         } 

     }catch(CustomException e){             
            if(APIConstants.NOT_FOUND==e.getMessage()){
                response.statuscode =404;   
                responseStr= CustomException.sendJSONApiErrorResponse('Invalid service_code provided');            
            }               
     } 

     RestContext.response.responseBody =   Blob.valueOf(responseStr);  

}

1 Answer 1

1

I have a service that returns JSON for .json and XML for .xml or no extension.

I notice that your URL mapping is:

urlMapping='/v2/services/*'

which I assume will not match either of these (try them):

[API endpoint]/services.json
[API endpoint]/services.xml

but would match either of these:

[API endpoint]/services/[service_code].json
[API endpoint]/services/[service_code].xml

Perhaps you need to introduce a "none" or "unknown" dummy service code or use the rather ugly:

[API endpoint]/services/.json
[API endpoint]/services/.xml

PS

On the status code question, this is what I have done in a couple of places:

@HttpGet
global static void get() {
    RestResponse res = RestContext.response;
    if (res == null) {
        res = new RestResponse();
        RestContext.response = res;
    }
    try {
        res.statusCode = 200;
        res.responseBody = Blob.valueOf(readConfiguration());
    } catch (EndUserMessageException e) {
        res.statusCode = 400;
        res.responseBody = Blob.valueOf(e.getMessage());
    } catch (Exception e) {
        res.statusCode = 500;
        res.responseBody = Blob.valueOf('SERVER ERROR\n\n' + String.valueOf(e) + '\n\n' + e.getStackTraceString());
    }
}
8
  • no that does not work either
    – Sneha
    Commented Aug 25, 2014 at 11:30
  • @Sneha Strange. Your are including your "v2" in the path aren't you? I suggest you find a case that works and start from there.
    – Keith C
    Commented Aug 25, 2014 at 13:27
  • yes i am adding v2 in the path. The problem started when i change the return type from String to void and added the response in this RestContext.response.responseBody = Blob.valueOf(responseStr);
    – Sneha
    Commented Aug 25, 2014 at 16:22
  • @Sneha In code where I set the responseBody I also set the statusCode to 200 when everything is OK and other values for errors.
    – Keith C
    Commented Aug 25, 2014 at 16:30
  • Sorry did not understand..You mean should i add status code?
    – Sneha
    Commented Aug 25, 2014 at 17:27

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .