使用Delphi的MARS REST API库时如何允许自定义请求头解决CORS问题?
解决MARS-Curiosity中CORS策略阻止自定义请求头的问题
问题根源
浏览器发起跨域请求时会触发OPTIONS预检请求,你的MARS服务返回的Access-Control-Allow-Headers响应头中未包含API_Key字段,导致浏览器拦截后续POST请求。Postman不受浏览器CORS策略限制,因此可以正常请求。
解决方案
在MARS中通过全局CORS配置添加允许的自定义请求头,具体有两种实现方式:
方式一:代码中配置CORS
在MARS应用启动时,直接配置CORS参数,允许指定的源、请求头和方法:
var LMARSApp: TMARSApplication; LCORSConfig: TMARSCORSConfiguration; begin LMARSApp := TMARSApplication.Create(nil); try // 初始化CORS配置 LCORSConfig := LMARSApp.Configuration.CORS; LCORSConfig.Enabled := True; // 允许你的前端源(根据实际情况调整) LCORSConfig.AllowedOrigins.Add('http://localhost'); // 添加允许的请求头,包含自定义的API_Key LCORSConfig.AllowedHeaders.Add('Content-Type'); LCORSConfig.AllowedHeaders.Add('API_Key'); // 允许必要的请求方法(预检请求需要OPTIONS) LCORSConfig.AllowedMethods.Add('POST'); LCORSConfig.AllowedMethods.Add('OPTIONS'); // 注册你的资源类 LMARSApp.AddResource<TPersonResource>('/person'); LMARSApp.Run; finally LMARSApp.Free; end; end;
方式二:通过配置文件(mars.cfg)配置
如果你的MARS应用使用配置文件管理参数,可以在[CORS]节点中添加以下配置:
[CORS] Enabled=True AllowedOrigins=http://localhost AllowedHeaders=Content-Type,API_Key AllowedMethods=POST,OPTIONS
验证配置
配置完成后重启MARS服务,再次发起JavaScript请求:
- 浏览器会先发送OPTIONS预检请求,服务端返回的响应头中会包含
Access-Control-Allow-Headers: Content-Type,API_Key - 预检通过后,浏览器会正常发送POST请求,不再触发CORS错误
内容的提问来源于stack exchange,提问作者Shaun Roselt
相关产品推荐
相关产品推荐

