在URLEncoded Http Post请求中保留+(加号)

时间:2018-11-29 20:01:36

标签: angular http urlencode

我具有用于登录请求的功能。

private login(params: LoginParams): Promise<any> {
    const loginHeaders: HttpHeaders = new HttpHeaders()
        .set('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')
        .set('site', 'first');

    const loginCredentials = new HttpParams()
        .set('j_username', params.username)
        .set('j_password', params.password);

    const requestUrl = this.appConfig.baseUrl + 'restoftheurl';

    return this.http
        .post(requestUrl, loginCredentials.toString(),
            {headers: loginHeaders, responseType: 'text'})
        .toPromise();
  }

如果密码中带有加号(+),则将其编码为空格符号,然后该请求将成为错误的凭据,失败。如何保留加号?我在做什么错了?

3 个答案:

答案 0 :(得分:1)

在发送密码之前,只需使用encodeURIComponent对密码进行编码。

private login(params: LoginParams): Promise < any > {

  ...

  const loginCredentials = new HttpParams()
    .set('j_username', params.username)
    .set('j_password', encodeURIComponent(params.password));

  ...
}

注意::在API端,您必须使用decodeURIComponent(yourPasswordParam)来获取实际密码。

更新:

只需在这里尝试一下,看看它在编码方面能带来什么:

var encodedUsername = encodeURIComponent('mclovin+');
console.log('Encoding Username gives: ', encodedUsername);
console.log('NOT mclovin%252B');

var encodedPassword = encodeURIComponent('fogell+');
console.log('Encoding Password gives: ', encodedPassword);
console.log('NOT fogell%252B');

答案 1 :(得分:1)

这也是一个Angular问题( @ angular / common / http

它将解释原始的 + 符号代替空格。

您可以将 HttpParameterCodec 实现为简单的编码器,例如:

import {HttpParameterCodec} from "@angular/common/http";
export class HttpUrlEncodingCodec implements HttpParameterCodec {
    encodeKey(k: string): string { return standardEncoding(k); }
    encodeValue(v: string): string { return standardEncoding(v); }
    decodeKey(k: string): string { return decodeURIComponent(k); }
    decodeValue(v: string) { return decodeURIComponent(v); }
}
function standardEncoding(v: string): string {
    return encodeURIComponent(v);
}

然后使用它进行正确编码:

const headers = new HttpHeaders({'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'});
const params = new HttpParams({encoder: new HttpUrlEncodingCodec()});
http.post(url, params, {headers: this.headers});

答案 2 :(得分:0)

如果您尝试将其作为URL的一部分发送,则必须使用encodeURIComponent对其进行编码。

看到您的代码,您正在HTTP参数中添加密码和用户名,这将显示在请求url中。

如果您不想将用户名和密码显示为url查询字符串的一部分,则可以将其作为请求主体发送给http调用,这样就无需执行encodeURIComponent

EX:console.log(encodeURIComponent('?x=test'));

console.log(encodeURIComponent('+test'));