OpenAPITools / OpenAPITools/openapi-generator
[REQ] [csharp] option to use asynchronous callbacks or generate it by default.
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 26.8k
- Forks
- 7.7k
- PR merge metrics
- PR metrics pending
Description
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.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the csharp generator and the templates that produce the generated ApiClient, client interface, and operation methods. Compare the existing synchronous flow with the requested RestSharp callback flow and the csharp-netcore generator, then determine how an option or default should be represented. Done means generated clients can expose asynchronous callbacks while remaining compatible with .NET Framework 4.5.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- csharp
- Domain
- tooling
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 30/100