传递编码数据时返回CORS错误的原因



我被迫处理较差的数据质量。一个例子是,给定表的主键值可以包含空格和特殊字符,例如35581/H0034-100003

我想做的是通过它的主键值来获取记录,所以我设置的web API是get:

[HttpGet]
[Route("Api/SaleHeaders/{saleNumberEncoded}")]
public SaleHdrViewModel GetSaleHeader(string saleNumberEncoded)
{
var saleNumber = HttpUtility.UrlDecode(saleNumberEncoded);
return _saleHeaderService.Get(saleNumber);
}

然后,当我从前端发送值时,我使用:

getSaleHeader(saleNumber: string): Observable<ISaleHeader> {
saleNumber = encodeURIComponent(saleNumber);
const url = `${environment.ApiUrl}/Api/SaleHeaders/${saleNumber}`;
return this.http.get<ISaleHeader>(url);
}

问题是请求失败,特别是由于CORS错误:

访问"localhost:52864/Api/SaleHeaders/%2035581%2FH0033-100000"处的XMLHttpRequesthttp://localhost:4200'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在"access control Allow Origin"标头。

我不认为这实际上是CORS错误。我认为这实际上与CORS有关,因为如果我编辑并使用Access-Control-Allow-Origin: *标头重新发送,它会返回404。我认为这与尝试发送编码的主键值有关。

我知道我可以将请求类型从GET更改为POST,然后只在正文中传递主键值,但我更喜欢以一致的方式获取记录(使用Api/{table}/{pk}路由的GET请求(。

编辑-我已经验证过,如果我传递了一个未编码的值(例如00007931(,那么端点工作正常。

不能将字符/用作路由参数,因为它将作为不同的资源访问读取。我建议您使用另一种模式对数据进行编码,以避免误解信息。否则,您可以使用以下方法将数据作为查询参数传递:

http://testweb.z/route?userdata=123/321

此外,您可以将方法签名更改为:(这是我向您推荐的方式(

[HttpGet]
[Route("Api/SaleHeaders/{table}/{pk}")]
public SaleHdrViewModel GetSaleHeader(string table, string pk)

我遵循Jorge Machado在评论部分发布的建议,将值编码为Base64,然后在服务器上解码。

角度:

getSaleHeader(saleNumber: string): Observable<ISaleHeader> {
saleNumber = btoa(saleNumber);
const url = `${environment.ApiUrl}/Api/SaleHeaders/${saleNumber}`;
return this.http.get<ISaleHeader>(url);
}

C#:

[HttpGet]
[Route("Api/SaleHeaders/{saleNumberEncoded}")]
public SaleHdrViewModel GetSaleHeader(string saleNumberEncoded)
{
var bytes = System.Convert.FromBase64String(saleNumberEncoded);
var saleNumber = System.Text.Encoding.UTF8.GetString(bytes);
return _saleHeaderService.Get(saleNumber);
}

这使我能够保持现有的GET端点模式,其中路由遵循以下模式:Api/{table name}/{primary key value}

最新更新