Angular4:HttpClient和HttpParams:传递一个对象作为httpParams.set()中的一个值

问题描述:

我有一个更复杂的键值对的问题...如果我想设置一个值作为对象怎么办?Angular4:HttpClient和HttpParams:传递一个对象作为httpParams.set()中的一个值

我有这样的问题:

const includeStr = JSON.stringify({include: 'match-timeline-events'}); 
const params: HttpParams = new HttpParams().set('filter', includeStr); 

,当我使用它:

this.http.get(environment.apiPath + '/clientMatches/' + id, {params}) 

我的头弄然后设置这个

(urlencoded): filter:%7B%22include%22:%22match-timeline-events%22%7D 

但出于某种原因, :没有得到编码,字符串应该是

(urlencoded): filter:%7B%22include%22%3A%22match-timeline-events%22%7D 

有什么想法该如何解决?

+0

从上面的代码中不清楚param key-value是如何用':'而不是'='分隔的。可能问题在别的地方。 – estus

+0

你是什么意思**:**而不是** = **? ...我说这是通过发送请求中的头文件...生成的url是:'http:// localhost:3000/api/... clientMatches/5987633c508eb519385779c8?filter =%7B%22include%22: %22match-timeline-events%22%7D' –

+0

我被另一个冒号弄糊涂了,'filter:%7B%2 ...'。这些参数是否会在服务器端造成麻烦?我猜他们不编码:[和其他列出的字符](https://github.com/angular/angular/blob/4.3.1/packages/common/http/src/params.ts#L59-L67),因为他们是安全的网址,只是在编码时浪费带宽。 – estus

这可能是一个应该报告的错误。任何方式,你可以用HttpParamscustom encoder来解决它,它可以扩展默认的HttpUrlEncodingCodec

可以看出,HttpUrlEncodingCodec使用custom functiondoesn't encode a colon on purpose

+0

是的,我想知道为什么:/ –