在ThinkPHP框架中进行跨域请求和动态代理的方法如下:
安装think-cors
扩展
composer require topthink/think-cors
修改配置文件config/cors.php
,设置允许跨域的域名、请求方法、响应头等信息
return [
'allow_origin' => ['http://localhost:8000'],
'allow_methods' => ['GET', 'POST'],
'allow_headers' => ['X-Requested-With', 'Content-Type', 'Token'],
'expose_headers' => [],
'max_age' => 0,
'allow_credentials' => true,
];
在控制器或中间件中使用跨域请求中间件
use think\middleware\Cors;
class Index
{
public function index()
{
return 'Hello, world!';
}
}
// 在控制器中使用
class Test extends Controller
{
protected $middleware = [
Cors::class,
];
public function index()
{
return 'Hello, world!';
}
}
// 在中间件中使用
class CheckToken
{
public function handle($request, Closure $next)
{
// 验证Token
// ...
return $next($request);
}
public function end(Response $response)
{
$response = $response->header([
'Cache-control' => 'no-cache',
'Pragma' => 'no-cache',
'Expires' => '0',
]);
return $response;
}
}
class Test extends Controller
{
protected $middleware = [
Cors::class,
CheckToken::class,
];
public function index()
{
return 'Hello, world!';
}
}
安装php-proxy
库
composer require php-http/guzzle6-adapter php-http/message php-http/httplug php-proxy/php-proxy
创建代理类app/proxy/Proxy.php
,实现HttpProxy
接口
namespace app\proxy;
use Http\Discovery\HttpClientDiscovery;
use Http\Discovery\MessageFactoryDiscovery;
use Proxy\Adapter\Guzzle\GuzzleAdapter;
use Proxy\Factory\DefaultResponseFactory;
use Proxy\Http\Filter\RemoveEncodingFilter;
use Proxy\Http\Filter\RemoveHopByHopHeadersFilter;
use Proxy\Http\Request\UriNormalizer;
use Proxy\Proxy;
class Proxy implements HttpProxy
{
public function handle($request)
{
$httpClient = HttpClientDiscovery::find();
$messageFactory = MessageFactoryDiscovery::find();
$adapter = new GuzzleAdapter($httpClient, $messageFactory);
$responseFactory = new DefaultResponseFactory();
$proxy = new Proxy($adapter, $responseFactory);
$proxy->filter(new RemoveEncodingFilter());
$proxy->filter(new RemoveHopByHopHeadersFilter());
$proxy->filter(new UriNormalizer());
$proxy->forward($request);
return $proxy->getResponse();
}
}
在控制器中使用代理
use app\proxy\Proxy;
use Zend\Diactoros\Request;
class Index
{
public function index()
{
$proxy = new Proxy();
$request = new Request('GET', 'https://example.com');
$response = $proxy->handle($request);
return $response->getBody()->getContents();
}
}
以上是在ThinkPHP框架中进行跨域请求和动态代理的方法。