2.2.7.5 Invoke Request Types

The purpose of the Invoke request is to enable a client to call a FunctionImport, as specified in [MC-CSDL] section 2.1.15, that is exposed by a service operation in a data service. Note that this excludes function imports that are used to specify either actions (section 2.2.1.3) or functions (section 2.2.1.4). AtomPub [RFC5023] does not define operations of this type. As such, this request type is not based on any AtomPub-defined [RFC5023] request.

Invoke Request MUST use the HTTP method specified by the data service's metadata document, as described in Conceptual Schema Definition Language Document for Data Services (section 2.2.3.7.2), and the URI specified by the client in the HTTP request line MUST be a URI which identifies a service operation, as described in Resource Path: Semantics (section 2.2.3.5).

If the FunctionImport, as specified in [MC-CSDL], that is exposed by a service operation requires input parameters, those parameters MUST be provided, as specified in Service Operation Parameters (section 2.2.3.6.3).

If the Invoke request is not successful (for example, an error occurred while processing the request), the response MUST be formatted according to Error Response (section 2.2.8.1).

The syntax of an Invoke request is defined as follows:

 invoke-Req    =     invoke-ReqLine
                           invoke-ReqHeaders
                           CRLF
  
 invoke-ReqLine      =     <Any standard or custom HTTP method>
                           ; The method supported for a particular 
                           ; service operation
                           ; is defined by the httpMethod CSDL annotation
                           ; defined in section 2.2.3.7.2
                           SP serviceOperationUri invoke-QueryOps
                           SP HTTP-Version
                           CRLF
  
 invoke-ReqHeaders   =     [DataServiceVersion]        ; see section 2.2.5.3
                           [MaxDataServiceVersion]     ; see section 2.2.5.7
                           *(HTTP-Header-Types)
  
 serviceOperationUri =     <Any Resource Path identifying a Service Operation>
                            ; see section 2.2.3 and section 2.2.3.5
  
 invoke-QueryOps      = ["?" (sysQueryOption / customQueryOption / serviceOpParam)
                         *("&" (customQueryOption / serviceOpParam) )]
                         ; see section 2.2.3.1 & section 2.2.3.6.3

The syntax of a response to a successful Invoke request is defined as follows:

 invoke-Resp         =      Status-Line                 ; see [RFC2616] section 6.1.1  
                            invoke-RespHeaders 
                            CRLF
                            invoke-RespBody
  
 invoke-RespHeaders  =      DataServiceVersion          ; see section 2.2.5.3   
                            [ETag]                      ; see section 2.2.5.4   
                            *(HTTP-Header-Types)
  
 invoke-RespBody     =      invoke-RespBody-collEt
                            / invoke-RespBody-et
                            / invoke-RespBody-collCt
                            / invoke-RespBody-ct
                            / invoke-RespBody-collPrim
  
 ; a Function Import which returns a collection of entities
 invoke-RespBody-collEt   = retrieveEntitySet-RespBody ; see section 2.2.7.2.1
        
  
 ; a Function Import which returns an entity
 invoke-RespBody-et       = retrieveEntity-RespBody    ; see section 2.2.7.2.2
  
 ; a Function Import which returns a collection of complex types
 invoke-RespBody-collCt   = <Collection of complex values formatted by using JSON
                             as per [ODataJSON4.0] section 7.4>
                            /<Collection of complex type instances formatted by using XML 
                              as per section 2.2.6.5.2>
                            /(begin-object 
                              quotation-mark "d" quotation-mark 
                              name-seperator 
                              entityCollCTInVJson
                              end-object) 
                              ; see section 2.2.6.3.5   
  
 ; a Function Import which returns a single Complex Type
 invoke-RespBody-ct       = retrieveCT-RespBody        ; see section 2.2.7.2.3
  
 ; a Function Import which returns a collection of primitives
 invoke-RespBody-collPrim = <Collection of primitive values formatted by using JSON
                             as per [ODataJSON4.0] section 7.3>
                            /<Collection of primitive type values formatted by using XML 
                             as per section 2.2.6.5.4>
                            /(begin-object 
                              quotation-mark "d" quotation-mark 
                              name-seperator 
                              entityCollPrimValueInVJson) 
                              end-object
                              ; see section 2.2.6.3.7    
  
 quotation-mark          = ; see [RFC4627] section 2.5
  
 ; a Function Import which returns a single primitive type value
 invoke-RespBody-prim     = retrievePP-RespBody        ; see section 2.2.7.2.4