Estoy tratando de hacer una solicitud POST pero no puedo hacer que funcione:
testRequest() { var body = 'username=myusername?password=mypassword'; var headers = new Headers(); headers.append('Content-Type', 'application/x-www-form-urlencoded'); this.http .post('/api', body, { headers: headers }) .subscribe(data => { alert('ok'); }, error => { console.log(JSON.stringify(error.json())); }); }Básicamente, quiero replicar esta solicitud http (no ajax) como si fuera originada por un formulario html:
URL: /api
Parámetros: usuario y contraseña
Actualización para Angular 4.3+
Ahora podemos usar HttpClient en lugar de Http
la guia esta aqui
Código de muestra
const myheader = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded') let body = new HttpParams(); body = body.set('username', USERNAME); body = body.set('password', PASSWORD); http .post('/api', body, { headers: myheader), }) .subscribe();Obsoleto
O puedes hacer así:
let urlSearchParams = new URLSearchParams(); urlSearchParams.append('username', username); urlSearchParams.append('password', password); let body = urlSearchParams.toString()Actualización oct/2017
Desde angular4+ , no necesitamos headers ni .toString() . En su lugar, puede hacer lo siguiente ejemplo
import { URLSearchParams } from '@angular/http';Método POST/PUT
let urlSearchParams = new URLSearchParams(); urlSearchParams.append('username', username); urlSearchParams.append('password', password); this.http.post('/api', urlSearchParams).subscribe( data => { alert('ok'); }, error => { console.log(JSON.stringify(error.json())); } )Método OBTENER/ELIMINAR
let urlSearchParams = new URLSearchParams(); urlSearchParams.append('username', username); urlSearchParams.append('password', password); this.http.get('/api', { search: urlSearchParams }).subscribe( data => { alert('ok'); }, error => { console.log(JSON.stringify(error.json())); } ) Para application/json
this.http.post('/api', JSON.stringify({ username: username, password: password, })).subscribe( data => { alert('ok'); }, error => { console.log(JSON.stringify(error.json())); } )Creo que el cuerpo no es correcto para un tipo de contenido application/x-www-form-urlencoded . Podrías intentar usar esto:
var body = 'username=myusername&password=mypassword';Espero que te ayude Thierry
En versiones posteriores de Angular2, no es necesario configurar manualmente el encabezado Content-Type y codificar el cuerpo si pasa un objeto del tipo correcto como body .
Simplemente puedes hacer esto
import { URLSearchParams } from "@angular/http" testRequest() { let data = new URLSearchParams(); data.append('username', username); data.append('password', password); this.http .post('/api', data) .subscribe(data => { alert('ok'); }, error => { console.log(error.json()); }); } De esta manera, angular codificará el cuerpo por usted y establecerá el encabezado Content-Type correcto.
PD: no olvides importar URLSearchParams desde @angular/http o no funcionará.