Я пытаюсь отправить запрос 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
Параметры: имя пользователя и пароль
typescript
angular
Кристофер
источник
источник
user_name
password
Ответы:
Я думаю, что тело не соответствует
application/x-www-form-urlencoded
типу контента. Вы можете попробовать использовать это:var body = 'username=myusername&password=mypassword';
Надеюсь, это поможет тебе, Тьерри
источник
import { URLSearchParams } from "@angular/http"
а не установлен по умолчанию, поэтому 1) вам не нужно делать.toString
это и 2) вам не нужно устанавливать тип содержимого. Angular сделает это автоматически для вас (см. Github.com/angular/angular/blob/4.4.4/packages/http/src/… )Обновление для 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()
Обновление октябрь / 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 метод
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())); } )
Для типа
application/json
содержимого JSONthis.http.post('/api', JSON.stringify({ username: username, password: password, })).subscribe( data => { alert('ok'); }, error => { console.log(JSON.stringify(error.json())); } )
источник
import { URLSearchParams } from "angular2/http"
В более поздних версиях 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()); }); }
Таким образом, angular закодирует тело за вас и установит правильный
Content-Type
заголовок.PS Не забывайте импортировать
URLSearchParams
из,@angular/http
иначе не получится.источник
FormData
, и угловой будет установлен вContent-Type
качествеmultipart/form-data
которой также работу.так что просто чтобы дать полный ответ:
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(); }
источник
Если кто-то борется с angular версией 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)); } }); }
источник
angular: MethodName(stringValue: any): Observable<any> { let params = new HttpParams(); params = params.append('categoryName', stringValue); return this.http.post('yoururl', '', { headers: new HttpHeaders({ 'Content-Type': 'application/json' }), params: params, responseType: "json" }) } api: [HttpPost("[action]")] public object Method(string categoryName)
источник
У меня были проблемы с каждым подходом, использующим несколько параметров, но он довольно хорошо работает с одним объектом
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;
с тем, что вы пытались сделать, значение, присвоенное телу, будет строкой.
источник