Necesito hacer una solicitud al mismo servidor, REST API en otro puerto.
¿Cómo puedo hacer esto sin codificar el nombre completo en las URL del servicio?
No hay necesidad de una solución específica de angular2. Puede usar window.location.hostname para obtener el nombre de host actual.
Tenga en cuenta, sin embargo, que si no desea utilizar variables globales como el objeto window directamente, puede proporcionar su propio objeto Window , que luego se puede inyectar.
Consulte esta muestra completa de Stackblitz Angular para obtener más información.
Como han dicho otros, la respuesta original ya no funciona. Para Angular 6+, debe proporcionar un token de inyección , de modo que el objeto de la window también se pueda resolver en la compilación AOT . De lo contrario, obtendrá el error "No se pueden resolver todos los parámetros".
Recomiendo crear una matriz WINDOW_PROVIDERS en un archivo separado como este:
import { InjectionToken, FactoryProvider } from '@angular/core'; export const WINDOW = new InjectionToken<Window>('window'); const windowProvider: FactoryProvider = { provide: WINDOW, useFactory: () => window }; export const WINDOW_PROVIDERS = [ windowProvider ] La constante WINDOW_PROVIDERS se puede agregar a la matriz de providers en AppModule de esta manera:
@NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule ], providers: [ WINDOW_PROVIDERS, // <- add WINDOW_PROVIDERS here SampleService, ], bootstrap: [AppComponent] }) export class AppModule { } En SampleService , el objeto de la window se puede inyectar utilizando el token de inyección definido de esta manera:
import { Injectable, Inject } from '@angular/core'; import { WINDOW } from '../window.provider'; @Injectable() export class SampleService { constructor(@Inject(WINDOW) private window: Window) { } getHostname() : string { return this.window.location.hostname; } } Por lo tanto, debe configurar el proveedor para el objeto Window al iniciar su aplicación.
import {provide} from 'angular2/core'; bootstrap(..., [provide(Window, {useValue: window})]);Después de eso, puede usar el objeto de ventana y acceder al nombre de host de esta manera:
constructor(private window: Window) { var hostname = this.window.location.hostname; }Otra opción es usar DOCUMENT from @angular/platform-browser.
import {DOCUMENT} from '@angular/platform-browser'; constructor(@Inject(DOCUMENT) private document: Document) { let url = document.location.protocol +'//'+ document.location.hostname + ':my_port' ); }Puede usar window , como han dicho otros, y para hacerlo inyectable, desde ng6 en adelante, necesita un token de inyección.
Declare el token de esta manera:
export const WINDOW = new InjectionToken('window', { providedIn: 'root', factory: () => window } );Luego úsalo en el constructor de clases:
class Foo { constructor(@Inject(WINDOW) private window: Window) { } } Como Window es una interfaz en TypeScript, si no realiza la inyección de esa manera, cuando construya el proyecto para producción obtendrá un error: Can't resolve all parameters for <ClassName> . Y luego otro: ERROR in : Error: Internal error: unknown identifier undefined .
Para comprender mejor la inyección, lea los documentos angulares para DI: https://angular.io/guide/dependency-injection