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

解决localhost中PUT请求CORS错误及Ballerina服务器资源识别问题

解决Ballerina服务PUT请求的CORS与资源匹配问题

问题现象

  • 向/projects/1发起PUT请求时触发CORS错误:

预检请求未通过访问控制检查:请求的资源上不存在'Access-Control-Allow-Origin'头。

  • Ballerina服务器无法识别该PUT请求对应的资源,预检响应如下:
HTTP/1.1 204 No Content
allow: GET, DELETE, OPTIONS
content-length: 0
server: ballerina
date: Tue, 21 Mar 2023 11:03:14 +0530, 0B

问题原因

  1. 资源路径不匹配:现有代码中PUT资源函数put .()仅匹配/projects路径,而请求的/projects/1没有对应的PUT资源定义,导致服务无法识别该请求。
  2. CORS头未生效:由于请求的资源不存在,Ballerina返回的默认OPTIONS响应不会加载服务配置的CORS规则,因此缺失Access-Control-Allow-Origin头,导致预检失败。

解决方案

添加匹配/projects/{id}路径的PUT资源函数,修改后的完整代码如下:

import ballerina/http;

@http:ServiceConfig {
    cors: {
        allowOrigins: ["http://localhost:3000"],
        allowMethods:["GET","POST","PUT","DELETE","OPTIONS"]
    }
}

service /projects on new http:Listener(8080) {
    isolated resource function post .(@http:Payload Project project) returns int|error? {
        return addProject(project);
    }

    isolated resource function get [int id]() returns Project|error? {
        return getProject(id);
    }

    isolated resource function get .() returns Project[]|error? {
        return getAllProjects();
    }

    // 新增匹配/projects/{id}的PUT资源,处理带ID的更新请求
    isolated resource function put [int id](@http:Payload Project project) returns int|error? {
        return updateProject(id, project);
    }

    // 保留原有匹配/projects的PUT资源(按需保留)
    isolated resource function put .(@http:Payload Project project) returns int|error? {
        return updateProject(project);
    }

    isolated resource function delete [int id]() returns int|error? {
        return removeProject(id);
    }
}

验证说明

修改后重新启动服务,向/projects/1发起预检请求时,响应会包含Access-Control-Allow-Origin: http://localhost:3000及其他CORS相关头,同时allow头会包含PUT方法,CORS错误将被解决,PUT请求也能被服务正确识别处理。

内容的提问来源于stack exchange,提问作者Dimuthu Madushan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:46:25