def __request_message_descriptor(self, request_kind, message_type, method_id,<EOL>path):
if isinstance(message_type, resource_container.ResourceContainer):<EOL><INDENT>base_message_type = message_type.body_message_class()<EOL>if (request_kind == self.__NO_BODY and<EOL>base_message_type != message_types.VoidMessage()):<EOL><INDENT>msg = ('<STR_LIT>'<EOL>'<STR_LIT>') % method_id<EOL>raise api_exceptions.ApiConfigurationError(msg)<EOL><DEDENT><DEDENT>else:<EOL><INDENT>base_message_type = message_type<EOL><DEDENT>if (request_kind != self.__NO_BODY and<EOL>base_message_type != message_types.VoidMessage()):<EOL><INDENT>self.__request_schema[method_id] = self.__parser.add_message(<EOL>base_message_type.__class__)<EOL><DEDENT>params = self.__params_descriptor(message_type, request_kind, path,<EOL>method_id)<EOL>return params<EOL>
Describes the parameters and body of the request.

        Args:
          request_kind: The type of request being made.
          message_type: messages.Message or ResourceContainer class. The message to
              describe.
          method_id: string, Unique method identifier (e.g. 'myapi.items.method')
          path: string, HTTP path to method.

        Returns:
          Dictionary describing the request.

        Raises:
          ValueError: if the method path and request required fields do not match