解决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
问题原因
- 资源路径不匹配:现有代码中PUT资源函数
put .()仅匹配/projects路径,而请求的/projects/1没有对应的PUT资源定义,导致服务无法识别该请求。 - 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
相关产品推荐
相关产品推荐

