在 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
服务。以其UrlSearchParams
和QueryEncoder
.
正如你在源代码中看到的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(使用前将#替换为@)