Сохранение + (знак плюс) в URLEncoded Http Post запрос - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть эта функция, которую я использую для запросов входа в систему.

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 голосов
/ 29 ноября 2018

Просто используйте 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');
0 голосов
/ 28 февраля 2019

Это также проблема 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});
0 голосов
/ 29 ноября 2018

Если вы пытаетесь отправить его как часть URL, это должно быть закодировано с использованием encodeURIComponent.

При просмотре кода вы добавляете пароль и имя пользователя в HTTP-параметрах, которые будут отображаться в запросеurl.

Если вы не хотите показывать имя пользователя и пароль как часть строки URL-запроса, вы можете отправить его как тело запроса для вызова http, и вам не нужно будет делать encodeURIComponent.

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

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