Angular2-параметры запроса HTTP POST
Я пытаюсь сделать запрос POST, но я не могу заставить его работать:
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()));
});
}
Я в основном хочу реплицировать этот http-запрос (не ajax), как будто он был создан с помощью html-формы:
URL: / api
Params: имя пользователя и пароль
8 ответов:
Я думаю, что тело не правильно для
application/x-www-form-urlencodedтип контента. Вы можете попробовать использовать это:var body = 'username=myusername&password=mypassword';надеюсь, что это помогает вам, Тьерри
обновление Angualar 4.3+
теперь мы можем использовать
HttpClientвместоHttpруководство здесь
пример кода
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();
устаревший
или вы можете сделать так:
let urlSearchParams = new URLSearchParams(); urlSearchParams.append('username', username); urlSearchParams.append('password', password); let body = urlSearchParams.toString()
Обновление Oct / 2017
С angular4+ не нужно
headersили.toString()питания. Вместо этого вы можете сделайте как ниже примерimport { URLSearchParams } from '@angular/http';метод 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())); } )GET / DELETE method
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())); } )для JSON
application/jsonContent-Typethis.http.post('/api', JSON.stringify({ username: username, password: password, })).subscribe( data => { alert('ok'); }, error => { console.log(JSON.stringify(error.json())); } )
в более поздних версиях Angular2 нет необходимости вручную устанавливать
Content-Typeзаголовок и кодирование тела, если вы передаете объект правильного типа, какbody.вы просто можете сделать это
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()); }); }таким образом угловой будет кодировать тело для вас и установит правильный
Content-Typeзаголовок.P. S. Не забудьте импортировать
URLSearchParamsС@angular/httpили это не будет работать.
так просто, чтобы сделать его полный ответ:
login(username, password) { var headers = new Headers(); headers.append('Content-Type', 'application/x-www-form-urlencoded'); let urlSearchParams = new URLSearchParams(); urlSearchParams.append('username', username); urlSearchParams.append('password', password); let body = urlSearchParams.toString() return this.http.post('http://localHost:3000/users/login', body, {headers:headers}) .map((response: Response) => { // login successful if there's a jwt token in the response console.log(response); var body = response.json(); console.log(body); if (body.response){ let user = response.json(); if (user && user.token) { // store user details and jwt token in local storage to keep user logged in between page refreshes localStorage.setItem('currentUser', JSON.stringify(user)); } } else{ return body; } }); }
эти ответы все устарели для тех, кто использует HttpClient, а не Http. Я начал сходить с ума, думая: "я сделал импорт URLSearchParams, но он все еще не работает без него .toString () и явный заголовок!"
С HttpClient, используйте HttpParams вместо URLSearchParams и обратите внимание на
body = body.append()синтаксис для достижения нескольких параметров в теле, так как мы работаем с неизменяемым объектом:login(userName: string, password: string): Promise<boolean> { if (!userName || !password) { return Promise.resolve(false); } let body: HttpParams = new HttpParams(); body = body.append('grant_type', 'password'); body = body.append('username', userName); body = body.append('password', password); return this.http.post(this.url, body) .map(res => { if (res) { return true; } return false; }) .toPromise(); }
Если кто-то борется с угловая версия 4+ (мой был 4.3.6). Это был пример кода, который работал для меня.
Сначала добавьте необходимый импорт
import { Http, Headers, Response, URLSearchParams } from '@angular/http';затем для функции api. Это пример входа в систему, который может быть изменен в соответствии с вашими потребностями.
login(username: string, password: string) { var headers = new Headers(); headers.append('Content-Type', 'application/x-www-form-urlencoded'); let urlSearchParams = new URLSearchParams(); urlSearchParams.append('email', username); urlSearchParams.append('password', password); let body = urlSearchParams.toString() return this.http.post('http://localhost:3000/api/v1/login', body, {headers: headers}) .map((response: Response) => { // login successful if user.status = success in the response let user = response.json(); console.log(user.status) if (user && "success" == user.status) { // store user details and jwt token in local storage to keep user logged in between page refreshes localStorage.setItem('currentUser', JSON.stringify(user.data)); } }); }
у меня были проблемы с каждым подходом с использованием нескольких параметров, но он довольно хорошо работает с одним объектом
api:
[HttpPut] [Route("addfeeratevalue")] public object AddFeeRateValue(MyValeObject val)угловое:
var o = {ID:rateId, AMOUNT_TO: amountTo, VALUE: value}; return this.http.put('/api/ctrl/mymethod', JSON.stringify(o), this.getPutHeaders()); private getPutHeaders(){ let headers = new Headers(); headers.append('Content-Type', 'application/json'); return new RequestOptions({ headers: headers , withCredentials: true // optional when using windows auth }); }
Я приземлился здесь, когда пытался сделать то же самое. Для типа контента application/x-www-form-urlencoded вы можете попробовать использовать это для тела:
var body = 'username' =myusername & 'password'=mypassword;с тем, что вы пытались сделать, значение, присвоенное телу, будет строкой.
Comments