Angular 角度2&;Slim PHP框架:如何正确转义字符串以用于GET请求 环境

Angular 角度2&;Slim PHP框架:如何正确转义字符串以用于GET请求 环境,angular,api,escaping,slim,slim-4,Angular,Api,Escaping,Slim,Slim 4,我有一个使用Angular2构建的前端,它与使用Slim PHP Framework v4构建的API进行通信 在Angular前端中,用户可以在表单中输入文本并提交,然后从API接收响应 Angular项目向URL/api/{text}发出请求 据我所知,无法访问Slim v4中通过提供的参数,例如,/api?text={text},因此我无法使用Angular的HttpParams功能。因此,URL直接传递给Angular的HttpClient。i、 e let text = 'Some r

我有一个使用Angular2构建的前端,它与使用Slim PHP Framework v4构建的API进行通信

在Angular前端中,用户可以在表单中输入文本并提交,然后从API接收响应

Angular项目向URL
/api/{text}
发出请求

据我所知,无法访问Slim v4中通过提供的参数,例如,
/api?text={text}
,因此我无法使用Angular的
HttpParams
功能。因此,URL直接传递给Angular的
HttpClient
。i、 e

let text = 'Some random text / with special characters \.';
let myObservable: Observable<MyResponseObject[]>;
myObservable = this.http.get<MyResponseObject[]>(
  'http://my.domain.name/api/' + text
).pipe(catchError(this.handleError));
我已经研究出如何从slimapi中读取'auth'的值。但是,当我修改get请求以添加
text
变量作为参数时,该参数从未提交,Slim API仍然只看到
auth
参数。修改后的代码如下:

myObservable = this.http.get<MyResponseObject[]>(
  'http://localhost:8080/ngrams/', {
  params: new HttpParams().set('text', text)
}).pipe(catchError(this.handleError));
myObservable=this.http.get(
'http://localhost:8080/ngrams/', {
params:new-HttpParams().set('text',text)
}).pipe(catchError(this.handleError));
因此这里没有错误,但“text”参数从未附加到URL(在提交请求时检查浏览器的网络选项卡时,我只能看到auth参数)

我是一个有棱角的傻瓜,所以这个逻辑可能有缺陷,但是上面的认证代码是从一个教程中复制的。我的想法是,在auth提供程序中分配
新的HttpParams()
可能会覆盖我为get请求设置的参数

当我手动或使用Postman创建相同的请求时,本地环境中的URL为
http://localhost:8080/api/?text=some 文本显示在此处
,然后我可以使用
$req->getQueryParams()
方法成功检索参数。

根据:

您可以使用
getQueryParams()
在请求对象上以关联数组的形式获取查询参数

以下是一个例子:

$app->get('/api',函数($request,$response,$args){
$response->getBody()->write('

根据Nima的回答,Slim API在使用
getQueryParams()
时正确读取了这些值。问题是参数一开始就没有发送

问题是,我的身份验证服务正在为http请求分配一个新的
HttpParams
对象,它应该在该对象中向现有参数集添加一个身份验证令牌

通过更新问题中提到的
intercept()
方法解决了此问题,从而将
auth
令牌附加到请求的现有
params
属性:

intercept(请求:HttpRequest,下一步:HttpHandler){
返回此.authService.user.pipe(取(1),排气图(用户=>{
如果(!用户){
返回next.handle(req);
}
const modifiedReq=req.clone({
params:req.params.set('auth',user.token)
});
返回next.handle(modifiedReq);
}));
}

我发送它们没有问题,但是Slim不理解格式。URL必须是/api/{text}而不是/api?={text}。如果我使用HttpParams,请求会成功发出,但是我的api无法解释参数,因为它的格式是?text={text}您可以轻松检索URL中发送的参数,例如
?param=value
。能否提供一个包含
text
参数的真实编码值的URL示例?例如
/api?text=some value
。我正在本地主机上运行,所以目前我正在使用测试语句“这是一个好消息”因此,在本例中,它是
让text='这是一个好句子';
然后我传递的URL与示例中的相同,但使用localhost..So
'http://localhost:8080/api/“+text
。我取得了一些进展。将更新问题。谢谢。我已更新了问题。它确实有效。当我在浏览器中手动设置URL时,or当我使用Postman时,
getQueryParams()
确实返回
text
参数,但是当我在Angular中通过HttpParams设置它时,它不会被发送。
myObservable = this.http.get<MyResponseObject[]>(
  'http://localhost:8080/ngrams/', {
  params: new HttpParams().set('text', text)
}).pipe(catchError(this.handleError));
Array
(
    [text] => special chars :  \ / ? % & ^ #
)
intercept(req: HttpRequest<any>, next: HttpHandler) {
  return this.authService.user.pipe(take(1), exhaustMap(user => {
    if(!user) {
      return next.handle(req);
    }
    const modifiedReq = req.clone({
      params: req.params.set('auth', user.token)
    });
    return next.handle(modifiedReq);
  }));
}