<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def make_request(self, method, service, path, body=None, query_params: QueryParams=None, headers: dict=None, correlation_id: str=None, content_type: str='application/json', context: Request=None, timeout=30, **kwargs) -> asyncio.coroutine: """ Make a request to another service. If `context` is provided, then context and correlation will be pulled from the provided request object for you. This includes credentials, correlationid, and service-headers. :param method: GET/PUT/PATCH, etc. :param service: name of service :param path: request object path :param body: body of request :param query_params: :param headers: :param correlation_id: :param content_type: :param context: A request object from which a "child-request" will be made :param timeout: Time in seconds the client will wait befor raising an asyncio.TimeoutError :param kwargs: Just a place holder so transport specific options can be passed through :return: """

        if not isinstance(method, Methods):
            method = Methods(method.upper())
        if content_type == 'application/json' and isinstance(body, dict):
            body = json.dumps(body)
        if isinstance(query_params, dict):
            query_string = parse.urlencode(query_params)
        elif isinstance(query_params, QueryParams):
            query_string = str(query_params)
        else:
            query_string = ''
        headers = headers or {}

        ctx = request_context.get()
        if context:
            warnings.warn("Passing in a context to waspy client is deprecated. "
                          "Passed in context will be ignored", DeprecationWarning)

        if not correlation_id:
            correlation_id = ctx['correlation_id']

        headers = {**headers, **ctx['ctx_headers']}

        exchange = headers.get('ctx-exchange-override', None)
        if exchange:
            kwargs['exchange'] = 'amq.headers'

        if isinstance(body, str):
            body = body.encode()
        response = asyncio.wait_for(
            self.transport.make_request(
                service, method.name, path, body=body, query=query_string,
                headers=headers, correlation_id=correlation_id,
                content_type=content_type, timeout=timeout, **kwargs),
            timeout=timeout)
        return response