在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 });
}
Run Code Online (Sandbox Code Playgroud)
当使用+123456参数作为参数调用get()时,我将进入123456接收服务。因此,在+转化为空间的途中。
我是否需要对HttpParams进行转义以使其对服务保持不变?
如果很重要,则后端是一个asp.net核心项目。控制器中的被调用代码:
[HttpGet("[action]")]
public async Task<JsonResult> Get(string phone) // receiving " 123456"
{
return Json(await PhoneSearchLogic.GetAsync(phone));
}
Run Code Online (Sandbox Code Playgroud)
[更新]NoémiSalaün的解释很好-但我想知道是否更改参数是“设计使然”的预期行为?还是ASP.NET Core控制器出现了问题,该控制器不应该取消+号(及其他符号)的影响?
ric*_*ckz 13
Angular 13 仍然存在这个问题。看看 \n https://github.com/angular/angular/issues/11058 和 \n https://github.com/angular/angular/pull/45111
\n对我有用的解决方案是由 Ali Kamalizade 编写的\n https://betterprogramming.pub/how-to-fix-angular-httpclient-not-escaping-url-parameters-ddce3f9b8746
\n以下是他的解决方案。No\xc3\xa9mi Sala\xc3\xbcn 在这个问题的接受答案中提出了相同的解决方案。
import { HttpParameterCodec } from \'@angular/common/http\';\nexport class CustomHttpParamEncoder implements HttpParameterCodec {\n encodeKey(key: string): string {\n return encodeURIComponent(key);\n }\n encodeValue(value: string): string {\n return encodeURIComponent(value);\n }\n decodeKey(key: string): string {\n return decodeURIComponent(key);\n }\n decodeValue(value: string): string {\n return decodeURIComponent(value);\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n您可以在创建 HttpParams 时使用它。
\n new HttpParams({ encoder: new CustomHttpParamEncoder() })\nRun Code Online (Sandbox Code Playgroud)\n编辑:\n这已在版本 14 中修复。请参阅\n https://github.com/angular/angular/blob/main/CHANGELOG.md#http-1 \n https://blog.angular.io/angular- v14-现已可用-391a6db736af
\nNoé*_*aün 11
如您在源代码common / http / src / params.ts中看到的,HttpParams使用默认编码器HttpUrlEncodingCodec。
HttpUrlEncodingCodec使用本机encodeURIComponent函数,然后对某些符号进行未编码以满足RFC规范的要求(本机JS实现未遵循)。
因此,如果要保持+符号编码,可以在使用之前手动对其进行编码HttpParams,也可以HttpParameterCodec使用自己的实现覆盖并将其传递给HttpParamOptions.encoder属性。
在现在已弃用的Http服务中,所有这些都可以得到更好的解释。与它UrlSearchParams和QueryEncoder。
如您在源代码中看到的http / src / url_search_params.ts
默认情况下,使用
QueryEncoder编码键和参数值encodeURIComponent,然后根据IETF RFC 3986:https://tools.ietf.org/html/rfc3986对未允许作为查询一部分的某些字符进行非编码。这些是未编码的字符:
! $ \' ( ) * + , ; A 9 - . _ ~ ? /如果允许的查询字符集对于特定的后端不可接受,则
QueryEncoder可以将其子类化并作为URLSearchParams的第二个参数提供。
| 归档时间: |
|
| 查看次数: |
5466 次 |
| 最近记录: |