descargar app javascript angular url

javascript - app - ng-src



Url angular más signo que convierte al espacio (5)

En Angular 5.2.7+, el "+" se reemplaza con el espacio "" en una cadena de consulta.

Aquí está el commit correspondiente: fix (router): fix serialización de URL

Si desea cambiar este comportamiento y reemplazar el "+" con "% 2B", puede crear un serializador de url personalizado y proporcionarlo en los proveedores de AppModule.

import { DefaultUrlSerializer, UrlSerializer, UrlTree } from ''@angular/router''; export default class CustomUrlSerializer implements UrlSerializer { private _defaultUrlSerializer: DefaultUrlSerializer = new DefaultUrlSerializer(); parse(url: string): UrlTree { // Encode "+" to "%2B" url = url.replace(//+/gi, ''%2B''); // Use the default serializer. return this._defaultUrlSerializer.parse(url); } serialize(tree: UrlTree): string { return this._defaultUrlSerializer.serialize(tree).replace(//+/gi, ''%2B''); } } @NgModule({ imports: [ BrowserModule, BrowserAnimationsModule, AppRoutingModule ], declarations: [ AppComponent ], providers: [ { provide: UrlSerializer, useClass: CustomUrlSerializer } ], entryComponents: [], bootstrap: [AppComponent] }) export class AppModule { }

http://localhost:3000/page?name=xyz+manwal

La URL se convertirá a:

http://localhost:3000/page?name=xyz%2Bmanwal

Espero que esto ayude.

Tengo una aplicación angular donde quiero pasar el signo más + en la cadena de consulta como:

http://localhost:3000/page?name=xyz+manwal

Cuando estoy golpeando esta URL su conversión a:

http://localhost:3000/page?name=xyz%20manwal

Donde % 20 se refieren al espacio . ¿Cómo puedo evitar esta conversión?


Este es un problema bastante común. Puede pasarlo normalmente en solicitud / x-www-form-urlencoded request. Ninguna otra solicitud podrá analizar correctamente +. Siempre lo analizarán en% 20 en lugar de% 2B.

Necesitaría manipular manualmente el parámetro de consulta, hay 2 formas:

  • Codifique el parámetro en la codificación de base64, de esta manera ningún carácter especial puede interrumpir su aplicación, pero necesitará manejarlo también en la parte receptora (decodificación).
  • Una solución más simple sería, antes de ir a la URL, reemplazar todos los signos + con% 2B. De esta manera el otro lado podrá decodificarlo normalmente, sin la necesidad de una rutina especial.

Para obtener más información, consulte las siguientes preguntas sobre desbordamiento de pila en Android: ¿cómo analizar la cadena de URL con espacios en el objeto URI? y la URL que codifica el carácter de espacio: + o% 20?


Este es un problema común. La URL utiliza el carácter + para separar dos palabras. Para utilizar el carácter + en los valores de los parámetros, debe codificar los valores de los parámetros antes de agregarlos como parte de la URL. Javascript / TypeScript proporciona una función encodeURI() para ese propósito específico.

La codificación de URL convierte los caracteres en un formato que se puede transmitir a través de Internet. [Referencia de w3Schools]

Aquí es cómo puede solucionar este problema:

let encodedName = encodeURI(''xyz+manwal''); let encodedURI = ''http://localhost:3000/page?name=''+encodedName; //.. OR using string interpolation let encodedURI = `http://localhost:3000/page?name=${ encodedName }`;

De la misma manera, puede decodificar los parámetros usando el método decodeURI() .

let decodedValue = decodeURI(encodedValue);


He encontrado la solución y la he publicado para futuras referencias. Angular js estaba convirtiendo el signo + en %2B .

El siguiente código impidió que:

.config([ ''$provide'', function($provide) { $provide.decorator(''$browser'', function($delegate) { let superUrl = $delegate.url; $delegate.url = (url, replace) => { if(url !== undefined) { return superUrl(url.replace(//%2B/g,"+"), replace); } else { return superUrl().replace(//+/g,"%2B"); } }; return $delegate; }); } ])


Puede anular la codificación angular predeterminada agregando Interceptor, que soluciona esto:

import { HttpInterceptor, HttpRequest, HttpEvent, HttpHandler, HttpParams, HttpParameterCodec } from "@angular/common/http"; import { Injectable } from "@angular/core"; import { Observable } from "rxjs"; @Injectable() export class EncodeHttpParamsInterceptor implements HttpInterceptor { intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { const params = new HttpParams({encoder: new CustomEncoder(), fromString: req.params.toString()}); return next.handle(req.clone({params})); } } class CustomEncoder implements HttpParameterCodec { encodeKey(key: string): string { return encodeURIComponent(key); } encodeValue(value: string): string { return encodeURIComponent(value); } decodeKey(key: string): string { return decodeURIComponent(key); } decodeValue(value: string): string { return decodeURIComponent(value); } }

y declararlo en la sección de proveedores en app.module.ts

providers: [ { provide: HTTP_INTERCEPTORS, useClass: EncodeHttpParamsInterceptor, multi: true } ]