使用 Swagger UI 进行测试时如何解决 API 中的 CORS 错误(使用 Lumen 实现)

Posted

技术标签:

【中文标题】使用 Swagger UI 进行测试时如何解决 API 中的 CORS 错误(使用 Lumen 实现)【英文标题】:How to solve CORS error in api (implemented using Lumen) while testing using Swagger UI 【发布时间】:2018-06-07 03:10:39 【问题描述】:

我在通过 Swagger UI 触发使用 Lumen 创建的 API 时遇到了 CORS 错误。所以我创建了一个中间件来解决这个CORS问题:

<?php

namespace App\Http\Middleware;

use Closure;

class CorsMiddleware
 
    /**
    * Handle an incoming request.
    *
    * @param  \Illuminate\Http\Request  $request
    * @param  \Closure  $next
      * @return mixed
    */
   public function handle($request, Closure $next)
    
        $headers = [
           'Access-Control-Allow-Origin'      => '*',
           'Access-Control-Allow-Methods'     => 'POST, GET, OPTIONS, PUT, DELETE',
           'Access-Control-Allow-Credentials' => 'true',
            'Access-Control-Max-Age'           => '86400',
           'Access-Control-Allow-Headers'     => 'Content-Type,  Authorization, X-Requested-With'
        ];

       if ($request->isMethod('OPTIONS'))
       
           return response()->json('"method":"OPTIONS"', 200, $headers);
       

       $response = $next($request);
       foreach($headers as $key => $value)
       
           $response->header($key, $value);
       

       return $response;
    

并在我的 API 路由中使用了这个中间件,现在在使用这个之后,我的严重错误问题解决了,但 API 无法正常工作,引发以下代码错误:

//**** code that throwing error starts ****

       $config = app()->make('config');

           $data = array_merge([
            'client_id'     => $config->get('secrets.client_id'),
            'client_secret' => $config->get('secrets.client_secret'),
            'grant_type'    => $grantType,
            'username' =>$data['username'],
            'password' =>$data['password']
        ], $data);

            $http = new Client();

            $headers = ['Content-Type' => 'application/json'];
            $guzzleResponse = $http->post( $config->get('app.url').'/oauth/token', [

            'form_params' => $data,
        ]);
             $tokenDetails = json_decode($guzzleResponse->getBody(),true);

//************** Code throwing error ends ******

现在,当我从路由中删除中间件时,API 与 POSTMAN 一起工作正常,但为 SWagger 抛出 CORS 错误,当我使用中间件解决 CORS 问题时,API 无法正常工作。

【问题讨论】:

错误是什么? 如果未使用中间件,则有时会出现 CORS 错误,如果使用会出现 500 内部服务器错误。 【参考方案1】:

在 .htaccess 中添加这一行

RewriteCond %REQUEST_METHOD 选项 重写规则 ^(.*)$ $1 [R=200,L] RewriteEngine上线后

【讨论】:

以上是关于使用 Swagger UI 进行测试时如何解决 API 中的 CORS 错误(使用 Lumen 实现)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 springfox 在 Swagger UI 中绕过授权

Swagger2 UI 提示"请确保swagger资源接口正确"解决办法

SpringBoot整合Swagger,方便后端测试

Swagger UI教程 API 文档神器 搭配Node使用

postman测试登录shiro

spring boot整合swagger时,打开swagger-ui中文出现乱码