You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ada的AWS Web服务器中添加CORS响应头?

解决Ada AWS Web服务器添加CORS响应头的问题

你的代码存在两个核心问题导致CORS头未生效:

  • 你创建的Headers列表没有关联到最终返回的响应对象上,添加的CORS头从未被发送
  • 未处理CORS预检的OPTIONS请求,浏览器跨域请求前会先发该请求,必须正确响应才能让后续请求通过

以下是修复后的完整代码,附带关键修改说明:

with AWS.Client;
with AWS.Response;
with AWS.Server;
with AWS.Server.Status;
with AWS.Status;
with Ada.Text_IO;
with Ada.Strings.Unbounded;
with AWS.Headers;

procedure aws_test is
   WS : AWS.Server.HTTP;

   function HW_CB (Request : in AWS.Status.Data) return AWS.Response.Data is
      URI              : constant String := AWS.Status.URI (Request);
      Method           : constant String := AWS.Status.Method (Request);
      Response_Headers : AWS.Headers.List;
      response_data    : AWS.Response.Data;
   begin
      -- 配置通用CORS响应头
      AWS.Headers.Add
        (Table => Response_Headers, Name => "Access-Control-Allow-Origin",
         Value => "*");
      AWS.Headers.Add
        (Table => Response_Headers, Name => "Access-Control-Allow-Methods",
         Value => "POST, GET, OPTIONS, PUT, DELETE");
      AWS.Headers.Add
        (Table => Response_Headers, Name => "Access-Control-Allow-Headers",
         Value => "*");
      AWS.Headers.Add
        (Table => Response_Headers, Name => "Access-Control-Max-Age", Value => "86400");

      -- 处理OPTIONS预检请求
      if Method = "OPTIONS" then
         return AWS.Response.Build ("text/plain", "", Response_Headers);
      end if;

      if URI = "/api/login" then
         declare
            para : Ada.Strings.Unbounded.Unbounded_String := AWS.Status.Binary_Data (Request);
         begin
            Ada.Text_IO.Put_Line (Ada.Strings.Unbounded.To_String (para));
            -- 构建响应时传入配置好的CORS头
            response_data := AWS.Response.Build ("text/html", "<p>Hello world !", Response_Headers);
            return response_data;
         end;
      else
         -- 其他路径同样返回带CORS头的响应
         return AWS.Response.Build ("text/html", "<p>Hum...", Response_Headers);
      end if;
   end HW_CB;

begin
   AWS.Server.Start
     (WS, "Hotel AI", Callback => HW_CB'Unrestricted_Access, Port => 8_080);
   delay 20.0;
   AWS.Server.Shutdown (WS);
   while not AWS.Server.Status.Is_Shutdown (WS) loop
      delay 5.0;
   end loop;
end aws_test;

关键修改点:

  • 将Response_Headers定义在回调内部,确保每次请求使用全新的头列表,避免全局变量的累积问题
  • 新增OPTIONS请求处理逻辑,直接返回带CORS头的空响应,满足浏览器预检要求
  • 调用AWS.Response.Build时传入配置好的Response_Headers,让头信息正确附加到响应中
  • 移除了原代码中未使用的变量,简化代码结构

修改后,服务器会正确返回CORS响应头,解决JavaScript中的跨域报错问题。

内容的提问来源于stack exchange,提问作者Nicolas Bachmaier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:06:22