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 요청 (아약스가 아님)을 html 형식에서 시작된 것처럼 복제하고 싶습니다.
URL : / api
매개 변수 : 사용자 이름 및 비밀번호
본문이 application/x-www-form-urlencoded
콘텐츠 유형에 맞지 않는 것 같습니다 . 이것을 사용해 볼 수 있습니다.
var body = 'username=myusername&password=mypassword';
도움이 되었기를 바랍니다, Thierry
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 년 10 월 업데이트
에서 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()));
}
)
JSON application/json
콘텐츠 유형의 경우
this.http.post('/api',
JSON.stringify({
username: username,
password: password,
})).subscribe(
data => {
alert('ok');
},
error => {
console.log(JSON.stringify(error.json()));
}
)
In later versions of Angular2 there is no need of manually setting Content-Type
header and encoding the body if you pass an object of the right type as body
.
You simply can do this
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());
});
}
This way angular will encode the body for you and will set the correct Content-Type
header.
P.S. Do not forget to import URLSearchParams
from @angular/http
or it will not work.
so just to make it a complete answer:
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;
}
});
}
These answers are all outdated for those utilizing the HttpClient rather than Http. I was starting to go crazy thinking, "I have done the import of URLSearchParams but it still doesn't work without .toString() and the explicit header!"
With HttpClient, use HttpParams instead of URLSearchParams and note the body = body.append()
syntax to achieve multiple params in the body since we are working with an immutable object:
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();
}
If anyone is struggling with angular version 4+ (mine was 4.3.6). This was the sample code which worked for me.
First add the required imports
import { Http, Headers, Response, URLSearchParams } from '@angular/http';
Then for the api function. It's a login sample which can be changed as per your needs.
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));
}
});
}
I was having problems with every approach using multiple parameters, but it works quite well with single object
api:
[HttpPut]
[Route("addfeeratevalue")]
public object AddFeeRateValue(MyValeObject val)
angular:
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
});
}
I landed here when I was trying to do a similar thing. For a application/x-www-form-urlencoded content type, you could try to use this for the body:
var body = 'username' =myusername & 'password'=mypassword;
with what you tried doing the value assigned to body will be a string.
참고URL : https://stackoverflow.com/questions/35212341/angular2-http-post-request-parameters
'Programing' 카테고리의 다른 글
특정 디렉토리의 디렉토리 수 계산 (0) | 2020.09.15 |
---|---|
여러 글꼴 두께, 하나의 @ font-face 쿼리 (0) | 2020.09.15 |
/var/lib/gems/2.3.0 디렉토리에 대한 쓰기 권한이 없습니다. (0) | 2020.09.15 |
Html을 일반 텍스트로 어떻게 변환합니까? (0) | 2020.09.15 |
C #의 팩토리 패턴 : 팩토리 클래스에서만 개체 인스턴스를 만들 수 있는지 확인하는 방법은 무엇입니까? (0) | 2020.09.15 |