【问题标题】:How to use automatic variables in Swagger UI?如何在 Swagger UI 中使用自动变量?
【发布时间】:2023-01-18 17:46:53
【问题描述】:

在 Postman 中,我可以自动保存来自响应主体的变量。

例如:首先,我发送登录请求,作为响应,我得到accessTokenrefreshToken 变量。

然后通过邮递员测试脚本我保存这些变量:

var jsonData = JSON.parse(responseBody);
postman.setEnvironmentVariable("access_token", jsonData.accessToken);
postman.setEnvironmentVariable("refresh_token", jsonData.refreshToken);

这些变量会在下一个请求中自动更新:

问题是我如何在 Swagger UI 中做同样的事情?

问题是每次我需要手动编写刷新令牌时,默认情况下在 Swagger UI 中:

【问题讨论】:

  • Swagger UI 具有可用于在请求之间传递值的 responseInterceptor and requestInterceptor。如果您的 Swagger UI 是由某些库/框架(例如 Swashbuckle 或 Swagger-Net)提供的,请检查它是否具有配置拦截器的选项。
  • Swashbuckle 具有可用的“UseRequestInterceptor”和“UseResponseInterceptor”扩展方法。检查这个link

标签: asp.net-core .net-core swagger-ui


【解决方案1】:

@CodingMytra 回复你的评论我找到了解决方案。

通过添加这些 UseRequestInterceptorUseResponseInterceptor 选项,accessTokenrefreshToken 变量会自动更新。

app.UseSwaggerUI(swaggerUiOptions =>
            {
                var responseInterceptor = @"(res) => 
                {
                    if(res.obj.accessToken)
                    { 
                        console.log(res.obj.accessToken);
                        const token = res.obj.accessToken;
                        localStorage.setItem('token', token);
                    };
                    if(res.obj.refreshToken)
                    { 
                        console.log(res.obj.refreshToken); 
                        const refresh_token = res.obj.refreshToken; 
                        localStorage.setItem('refresh_token', refresh_token); 
                    }; 
                    return res; 
                }";
                    var requestInterceptor = @"(req) => 
                { 
                    req.headers['Authorization'] = 'Bearer ' + localStorage.getItem('token');
                    req.headers['RefreshToken'] = localStorage.getItem('refresh_token');
                    return req; 
                }";
                swaggerUiOptions.UseResponseInterceptor(Regex.Replace(responseInterceptor, @"s+", " "));
                swaggerUiOptions.UseRequestInterceptor(Regex.Replace(requestInterceptor, @"s+", " "));
            });

【讨论】:

    【解决方案2】:

    对于纯 javascript,使用 responseInterceptor(获取令牌)和 requestInterceptor(设置令牌)函数。 见https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/

      <script>
        window.onload = () => {
          window.ui = SwaggerUIBundle({
            url: 'your_swagger_json.json',
            defaultModelsExpandDepth: -1,
            dom_id: '#swagger-ui',
            presets: [
              SwaggerUIBundle.presets.apis,
              SwaggerUIStandalonePreset
            ],
            layout: "StandaloneLayout",
            persistAuthorization: true,
            responseInterceptor: function (response) {
              if (response.obj.access_token) {
                let swaggertoken = response.obj.access_token;
                if (swaggertoken) {
                  localStorage.setItem("swaggertoken", swaggertoken)
                };
              };
              return response;
            },
            requestInterceptor: function (request) {
              request.headers.access_token = localStorage.getItem("swaggertoken");
              return request;
            },
          });
        };
      </script>
    

    【讨论】:

      猜你喜欢
      • 2021-10-30
      • 2017-12-25
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多