Control request and response content type

  • Release version: Xanadu
  • Updated August 1, 2024
  • 2 minutes to read
  • Summarize
    Summarized using AI
    This content was generated using new OpenAI-powered functionality. Results are provided on an as is basis and are not guaranteed to be accurate or complete.

    Summary of Control request and response content type

    This content explains how to manage and control the content types allowed in scripted REST API requests and responses within ServiceNow. By default, the platform supportsapplication/json,application/xml, andtext/xml, as well as user-defined custom JSON or XML subtypes. Proper handling of content types ensures your APIs respond correctly and avoid errors.

    Show full answer Show less

    Key Features

    • Default Content Types: You can configure default supported request and response formats for your API using the Default supported request formats and Default supported response formats fields. These control acceptable values for the Content-Type and Accept headers.
    • Resource-Level Overrides: Override defaults for individual resources through the Supported request formats and Supported response formats fields on the Scripted REST Service form. Note that Supported request formats applies only to PUT, POST, and PATCH methods.
    • Error Handling: If a request uses unsupported Content-Type or Accept headers, the API returns HTTP error codes 406 (Not Acceptable) or 415 (Unsupported Media Type) respectively.
    • Wildcard Content Types: Use wildcards to specify acceptable content types. The percent sign (%) matches a single character, and the asterisk () matches zero or more characters. This allows flexible pattern matching for content types.
    • Handling application/x-www-form-urlencoded: When your API accepts this content type, urlencoded key-value pairs from the request body and query parameters are merged into request.queryParams as a JSON map, simplifying access to these parameters.
    • Accessing Request Body for Non-JSON/XML: If the request body format is not a JSON or XML subtype, access it only via the dataStream field. Attempting to access it by other means (like data, dataString, nextEntry(), or hasNext()) will cause a 500 error.
    • Sending Binary Responses: To send binary data in a response, set the response content type accordingly and write the binary stream directly using a RESTAPIResponseStream object accessed by response.getStreamWriter().

    Practical Implications for ServiceNow Customers

    Understanding and configuring supported content types ensures your scripted REST APIs handle requests and responses appropriately and avoid common HTTP errors. Setting default and resource-specific content types tailors API behavior to your integration needs. The ability to handle application/x-www-form-urlencoded content by merging body and query parameters into request.queryParams simplifies parameter management. Proper handling of non-JSON/XML request bodies and binary response data ensures robustness across diverse data formats.

    Controls which content types are allowed in scripted REST API requests and responses.

    By default, scripted REST APIs support application/json, application/xml, and text/xml. User-defined custom content types (with json or xml subtypes) are also supported. For example, application/vnd.collection+json and application/vnd.adobe.xdp+xml are treated as JSON and XML, respectively.
    Important:
    If the request body format is not of a json or xml subtype, use only the request body dataStream field to access the request body. Using request body data, dataString, nextEntry(), or hasNext() with a non-json or non-xml format results in a 500 error response.

    Setting defaults

    You can set default values for the API using the Default supported request formats and Default supported response formats fields. These fields define acceptable values users can pass in the Content-Type and Accept request headers, respectively. If a requesting user specifies an Accept or Content-Type header not supported by the API or resource, the instance responds with an HTTP error code of 406 or 415.

    You can override these values for each resource using the Supported request formats and Supported response formats on the Scripted REST Service form.
    Note:
    The Supported request formats field appears only for PUT, POST, and PATCH resources.

    Using wildcard values

    You can use wildcard values when specifying valid content types.
    • To perform a single-character wildcard search, use the percent sign (%) character. This wildcard finds words that contain any one character in place the percent-sign-character. For example, to find words such as text or test, search for: te%t.
    • To perform a multiple-character wildcard search, use the asterisk (*) character. This wildcard finds words that contain zero or more characters in place of the asterisk-character. For example, to find words such as planned or placed, search for: pl*d.

    Using the x-www-form-urlencoded content type

    If a REST API or resource accepts the application/x-www-form-urlencoded content-type, you can retrieve the urlencoded values provided in the request as a JSON map. You can then supply these urlencoded key-value pairs as query parameters, in the request body, or both. They are combined and stored in the request parameters. Access these parameters through the request.queryParams object.

    For example, if your API is defined to accept the application/x-www-form-urlencoded content-type and your API is implemented as follows,
    (function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
    
     response.setBody(request.queryParams);
    
    })(request, response);
    … then the following request yields the respective response:
    POST to localhost:8080/api/now/some_api/some_resource?name3=value3&name4=value4
    Body:
    name1=value1&name2=value2
    Response:
    { "result":
        { "name4": [ "value4" ], "name3": [ "value3" ], "name2": [ "value2" ],
          "name1": [ "value1" ]
        }
    }

    Sending binary type in a response

    When sending a binary type in a response, you must set the response content type and write the binary stream directly using a RESTAPIResponseStream object. You can access this object by calling getStreamWriter() on the response object. For more information, see.