如何转义角度 HttpParams?

2024-05-15

在 Angular 服务中,我使用 HttpParams 将字符串发送到服务:

get(phone: string): Observable<PhoneSearchResponse> {
    let params = new HttpParams();
    params = params.append("phone", phone); // sending "+123456"
    return this._http.get<PhoneSearchResponse>(`${this._apiurl}/Get`, { params: params });
}

当调用 get() 时+123456作为参数我会得到123456在接收服务中。所以在路上的某个地方+被转换为空格。

我是否需要转义 HttpParams 才能使它们不变地传递给服务?

如果重要的话,后端是一个asp.net core项目。控制器中调用的代码:

[HttpGet("[action]")]
public async Task<JsonResult> Get(string phone) // receiving " 123456"
{
  return Json(await PhoneSearchLogic.GetAsync(phone));
}

[更新] Noémi Salaün 的解释非常好 - 但我想知道更改参数是否是“设计”的预期行为?或者问题是 ASP.NET Core 控制器,它不应该转义 + 号(和其他符号)?


正如你在源代码中看到的通用/http/src/params.ts https://github.com/angular/angular/blob/5.2.9/packages/common/http/src/params.ts#L106, HttpParams使用默认编码器HttpUrlEncodingCodec.

HttpUrlEncodingCodec使用原生的encodeURIComponent函数,但随后取消编码一些符号以满足 RFC 规范(不遵循本机 JS 实现)。

所以如果你想保留你的+符号编码您可以在使用之前手动对其进行编码HttpParams,或者您可以覆盖HttpParameterCodec用你自己的实现并将其传递给HttpParamOptions.encoder属性。

所有这些在现在已弃用的中得到了更好的解释Http服务。以其UrlSearchParamsQueryEncoder.

正如你在源代码中看到的http/src/url_search_params.ts https://github.com/angular/angular/blob/5.2.9/packages/http/src/url_search_params.ts#54

默认情况下,QueryEncoder使用对参数的键和值进行编码encodeURIComponent,然后根据 IETF RFC 3986 对允许成为查询一部分的某些字符进行取消编码:https://www.rfc-editor.org/rfc/rfc3986 https://www.rfc-editor.org/rfc/rfc3986.

这些是未编码的字符:! $ \' ( ) * + , ; A 9 - . _ ~ ? /

如果允许的查询字符集对于特定后端来说不可接受,QueryEncoder可以进行子类化并作为 URLSearchParams 的第二个参数提供。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何转义角度 HttpParams? 的相关文章