request method

  1. @override
Future<O?> request(
  1. I? input,
  2. RequestContext context
)
override

Request to the server.

Implementation

@override
Future<O?> request(I? input, RequestContext context){
  context.setInput(name, context);
  Future<HttpClientRequest> req;
  ApiServerIO server = ApiRegistory.getApiServer(_serverName) as ApiServerIO;
  Uri uri;
  if(_uriBuilder != null){
    uri = _uriBuilder!(server.scheme, server.host, server.port, _path, input, context, (scheme, host, port, path, input) => server.uriBuilder?.call(server.scheme, server.host, server.port, _path, _method, input));
  }else if(server.uriBuilder != null){
    uri = server.uriBuilder!(server.scheme, server.host, server.port, _path, _method, input);
  }else{
    uri = Uri(
      host: server.host,
      port: server.port,
      scheme: server.scheme,
      path: _path
    );
  }
  switch(_method){
  case HttpMethod.GET:
    req = server.client.getUrl(uri);
    break;
  case HttpMethod.POST:
    req = server.client.postUrl(uri);
    break;
  case HttpMethod.PUT:
    req = server.client.putUrl(uri);
    break;
  case HttpMethod.PATCH:
    req = server.client.patchUrl(uri);
    break;
  case HttpMethod.HEAD:
    req = server.client.headUrl(uri);
    break;
  case HttpMethod.DELETE:
    req = server.client.deleteUrl(uri);
    break;
  }
  Future<HttpClientResponse> resp = req.then((HttpClientRequest request){
    if(_requestBuilder != null){
      _requestBuilder!(request, input, (request, input) => server.requestBuilder?.call(request, _method, input));
    }else if(server.requestBuilder != null){
      server.requestBuilder!(request, _method, input);
    }
    return request.close();
  }).catchError(
    (e) => context.exception = e
  ).whenComplete(() {if(context.exception != null) throw context.exception;});

  O? output = _outputCreator == null ? null : _outputCreator!(context);
  return resp.then((HttpClientResponse response) async{
    try{
      if(_responseParser != null){
        await _responseParser!(
          response,
          output,
          (response, output) {
            return server.responseParser?.call(response, _method, output)
              .catchError((e) => (e) => context.exception = e);
          }
        );

      }else if(server.responseParser != null){
        await server.responseParser!(response, _method, output);
      }
    }catch(e){
      context.exception = e;
    }
    if(output != null){
      context.setOutput(name, output);
    }
    return output;
  }).catchError(
    (e) => context.exception = e
  ).whenComplete(() {if(context.exception != null) throw context.exception;});
}