【问题标题】:Howto prevent null values in querystring with NSwag如何使用 NSwag 防止查询字符串中出现空值
【发布时间】:2019-11-30 07:45:31
【问题描述】:

我使用NSwag 来生成 TypeScript 代码。当我在 Web API 中使用可为空的 int 时,生成的 nswag 代码会发送 null。

如何防止NSwag 生成此代码或允许 .NET Core 3.1 接受此作为有效值?

http://localhost:4000/api/SurveyManagement/UpdateRouteSurvey?toSurveyId=null

生成的 TypeScript 代码:

updateRouteSurvey(toSurveyId: number | null): Observable<void> {
        let url_ = this.baseUrl + "/api/SurveyManagement/UpdateRouteSurvey?";
        if (toSurveyId === undefined)
            throw new Error("The parameter 'toSurveyId' must be defined.");
        else
            url_ += "toSurveyId=" + encodeURIComponent("" + toSurveyId) + "&"; 
        url_ = url_.replace(/[?&]$/, "");
...

C# API 接口

  [HttpPost(nameof(UpdateRouteSurvey))]
        public async Task UpdateRouteSurvey(int? toSurveyId) =>
            await _manageSurveyService.UpdateRouteSurvey(toSurveyId);

NSwag 配置

 "openApiToTypeScriptClient": {
      "className": "{controller}Client",
      "moduleName": "",
      "namespace": "",
      "typeScriptVersion": 2.7,
      "template": "Angular",
      "promiseType": "Promise",
      "httpClass": "HttpClient",
      "useSingletonProvider": false,
      "injectionTokenType": "InjectionToken",
      "rxJsVersion": 6.0,
      "dateTimeType": "Date",
      "nullValue": "Null",
      "generateClientClasses": true,
      "generateClientInterfaces": false,
      "generateOptionalParameters": false,
      "exportTypes": true,
      "wrapDtoExceptions": false,
      "exceptionClass": "SwaggerException",
      "clientBaseClass": null,
      "wrapResponses": false,
      "wrapResponseMethods": [],
      "generateResponseClasses": true,
      "responseClass": "SwaggerResponse",
      "protectedMethods": [],
      "configurationClass": null,
      "useTransformOptionsMethod": false,
      "useTransformResultMethod": false,
      "generateDtoTypes": true,
      "operationGenerationMode": "MultipleClientsFromOperationId",
      "markOptionalProperties": false,
      "generateCloneMethod": false,
      "typeStyle": "Interface",
      "classTypes": [],
      "extendedClasses": [],
      "extensionCode": null,
      "generateDefaultValues": false,
      "excludedTypeNames": [],
      "excludedParameterNames": [],
      "handleReferences": false,
      "generateConstructorInterface": true,
      "convertConstructorInterfaceData": false,
      "importRequiredTypes": true,
      "useGetBaseUrlMethod": false,
      "baseUrlTokenName": "API_BASE_URL",
      "queryNullValue": "",
      "inlineNamedDictionaries": false,
      "inlineNamedAny": false,
      "templateDirectory": null,
      "typeNameGeneratorType": null,
      "propertyNameGeneratorType": null,
      "enumNameGeneratorType": null,
      "serviceHost": null,
      "serviceSchemes": null,

    }

【问题讨论】:

    标签: typescript asp.net-core nswag


    【解决方案1】:

    我找到了创建正确的 null 处理的解决方案。

    使用NSwag 可以定义您自己的模板。首先在您的nswag.config 中设置模板目录,并在此目录中创建一个文件Client.RequestUrl.liquid,其内容如下

    let url_ = this.baseUrl + "/{{ operation.Path }}{% if operation.HasQueryParameters %}?{% endif %}";
    {% for parameter in operation.PathParameters -%}
    {%     if parameter.IsRequired -%}
    if ({{ parameter.VariableName }} === undefined || {{ parameter.VariableName }} === null)
        throw new Error("The parameter '{{ parameter.VariableName }}' must be defined.");
    {%     else -%}
    if ({{ parameter.VariableName }} !== null && {{ parameter.VariableName }} !== undefined)
    {%     endif -%}
    {%     if parameter.IsDateOrDateTimeArray -%}
    url_ = url_.replace("{{ "{" }}{{ parameter.Name }}}", encodeURIComponent({{ parameter.VariableName }}.map(s_ => s_ ? s_.toJSON() : "null").join()));
    {%     elseif parameter.IsDateOrDateTime -%}
    url_ = url_.replace("{{ "{" }}{{ parameter.Name }}}", encodeURIComponent({{ parameter.VariableName }} ? "" + {{ parameter.VariableName }}.toJSON() : "null"));
    {%     elseif parameter.IsArray -%}
    url_ = url_.replace("{{ "{" }}{{ parameter.Name }}}", encodeURIComponent({{ parameter.VariableName }}.join()));
    {%     else -%}
    url_ = url_.replace("{{ "{" }}{{ parameter.Name }}}", encodeURIComponent("" + {{ parameter.VariableName }}));
    {%     endif -%}
    {%     if parameter.IsOptional -%}
    else
        url_ = url_.replace("/{{ "{" }}{{ parameter.Name }}}", "");
    {%     endif -%}
    {% endfor -%}
    {% for parameter in operation.QueryParameters -%}
    {%     if parameter.IsRequired -%}
    {%         if parameter.IsNullable -%}
    if ({{ parameter.VariableName }} === undefined)
        throw new Error("The parameter '{{ parameter.VariableName }}' must be defined.");
    else
    {%         else -%}
    if ({{ parameter.VariableName }} === undefined || {{ parameter.VariableName }} === null)
        throw new Error("The parameter '{{ parameter.VariableName }}' must be defined and cannot be null.");
    else
    {%         endif -%}
    {%     else -%}
    {%         if parameter.IsNullable -%}
    if ({{ parameter.VariableName }} !== undefined)
    {%         else -%}
    if ({{ parameter.VariableName }} === null)
        throw new Error("The parameter '{{ parameter.VariableName }}' cannot be null.");
    else if ({{ parameter.VariableName }} !== undefined)
    {%         endif -%}
    {%     endif -%}
    {%     if parameter.IsDateOrDateTimeArray -%}
        {{ parameter.VariableName }} && {{ parameter.VariableName }}.forEach(item_ => { url_ += "{{ parameter.Name }}=" + encodeURIComponent(item_ ? "" + item_.toJSON() : "null") + "&"; });
    {%     elseif parameter.IsObjectArray -%}
        {{ parameter.VariableName }} && {{ parameter.VariableName }}.forEach((item, index) => {
            for (let attr in item)
                if (item.hasOwnProperty(attr)) {
                    url_ += "{{ parameter.Name }}[" + index + "]." + attr + "=" + encodeURIComponent("" + (<any>item)[attr]) + "&";
                }
        });
    {%     elseif parameter.IsDateOrDateTime -%}
        url_ += "{{ parameter.Name }}=" + encodeURIComponent({{ parameter.VariableName }} ? "" + {{ parameter.VariableName }}.toJSON() : "{{ QueryNullValue }}") + "&";
    {%     elseif parameter.IsArray -%}
        {{ parameter.VariableName }} && {{ parameter.VariableName }}.forEach(item => { url_ += "{{ parameter.Name }}=" + encodeURIComponent("" + item) + "&"; });
    {%     else -%}
        url_ += "{{ parameter.Name }}=" + ({{ parameter.VariableName }} !== null ? encodeURIComponent("" + {{ parameter.VariableName }}) : '') + "&";
    {%     endif -%}
    {% endfor -%}
    url_ = url_.replace(/[?&]$/, "");
    
    

    【讨论】:

      猜你喜欢
      • 2015-04-02
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多