Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • O openapi-generator
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 3,476
    • Issues 3,476
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 402
    • Merge requests 402
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • OpenAPI Tools
  • openapi-generator
  • Issues
  • #7265
Closed
Open
Issue created Aug 20, 2020 by Administrator@rootContributor

[REQ] [csharp] option to use asynchronous callbacks or generate it by default.

Created by: jonaslagoni

Is your feature request related to a problem? Please describe.

This is a dublicate issue from https://github.com/swagger-api/swagger-codegen/issues/10424

I want to have the option of asynchronously call the api with the csharp generator. I am unable to use the generator csharp-netcore which has this feature.

Describe the solution you'd like

With the following document

swagger: '2.0'
tags:
- name: Server
  description: Operations available to retrieve information about a server
paths:
  /servers/{server_id}:
    get:
      tags:
        - Server
      summary: Get basic server information
      operationId: getServer
      description: |
        This returns basic information about a specific server
      parameters:
        - name: server_id
          in: path
          description: The server id to retrieve the basic information about
          type: integer
          required: true

This is what I changed in the old generated code and what could be generated alongside/in replacement.

Add a method called CallApiAsync to the generated ApiClient

        public void CallApiAsync(String path, RestSharp.Method method, Dictionary<String, String> queryParams, String postBody,
            Dictionary<String, String> headerParams, Dictionary<String, String> formParams,
            Dictionary<String, FileParameter> fileParams, String[] authSettings, Action<IRestResponse> callback)
        {

            var request = new RestRequest(path, method);

            UpdateParamsForAuth(queryParams, headerParams, authSettings);

            // add default header, if any
            foreach (var defaultHeader in _defaultHeaderMap)
                request.AddHeader(defaultHeader.Key, defaultHeader.Value);

            // add header parameter, if any
            foreach (var param in headerParams)
                request.AddHeader(param.Key, param.Value);

            // add query parameter, if any
            foreach (var param in queryParams)
                request.AddParameter(param.Key, param.Value, ParameterType.GetOrPost);

            // add form parameter, if any
            foreach (var param in formParams)
                request.AddParameter(param.Key, param.Value, ParameterType.GetOrPost);

            // add file parameter, if any
            foreach (var param in fileParams)
                request.AddFile(param.Value.Name, param.Value.Writer, param.Value.FileName, param.Value.ContentType);

            if (postBody != null) // http body (model) parameter
                request.AddParameter("application/json", postBody, ParameterType.RequestBody);
            RestClient.ExecuteAsync(request, callback);

        }

Change the generated client interface form from

Server GetServer (int? serverId);

to

void GetServer (int? serverId, Action<ApiException, Server> callback);

Change the generated client methods from:

        public Server GetServer (int? serverId)
        {
            
            // verify the required parameter 'serverId' is set
            if (serverId == null) throw new ApiException(400, "Missing required parameter 'serverId' when calling GetServer");
            
    
            var path = "/servers/{server_id}";
            path = path.Replace("{format}", "json");
            path = path.Replace("{" + "server_id" + "}", ApiClient.ParameterToString(serverId));
    
            var queryParams = new Dictionary<String, String>();
            var headerParams = new Dictionary<String, String>();
            var formParams = new Dictionary<String, String>();
            var fileParams = new Dictionary<String, FileParameter>();
            String postBody = null;
    
            // make the HTTP request
            IRestResponse response = (IRestResponse) ApiClient.CallApi(path, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, authSettings);
    
            if (((int)response.StatusCode) >= 400)
                throw new ApiException ((int)response.StatusCode, "Error calling GetServer: " + response.Content, response.Content);
            else if (((int)response.StatusCode) == 0)
                throw new ApiException ((int)response.StatusCode, "Error calling GetServer: " + response.ErrorMessage, response.ErrorMessage);
    
            return (Server) ApiClient.Deserialize(response.Content, typeof(Server), response.Headers);
        }

to

        public void GetServer (int? serverId, Action<ApiException, Server> callback)
        {
            
            // verify the required parameter 'serverId' is set
            if (serverId == null) throw new ApiException(400, "Missing required parameter 'serverId' when calling GetServer");
            
    
            var path = "/servers/{server_id}";
            path = path.Replace("{format}", "json");
            path = path.Replace("{" + "server_id" + "}", ApiClient.ParameterToString(serverId));
    
            var queryParams = new Dictionary<String, String>();
            var headerParams = new Dictionary<String, String>();
            var formParams = new Dictionary<String, String>();
            var fileParams = new Dictionary<String, FileParameter>();
            String postBody = null;

            // make the HTTP request
            ApiClient.CallApiAsync(path, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, authSettings, (response) =>
            {
                ApiException exception = null;
                if (((int)response.StatusCode) >= 400)
                    exception = new ApiException((int)response.StatusCode, "Error calling GetServer: " + response.Content, response.Content);
                else if (((int)response.StatusCode) == 0)
                    exception = new ApiException((int)response.StatusCode, "Error calling GetServer: " + response.ErrorMessage, response.ErrorMessage);

                callback(exception, (Server)ApiClient.Deserialize(response.Content, typeof(Server), response.Headers));
            });
        }

Describe alternatives you've considered

Tried to use the charp-netcore generator which has a version of this feature but it has to be compatible with .NET Framework 4.5. Tried to use the original swagger-codegen library which also does not have this feature.

Assignee
Assign to
Time tracking