我正在尝试使用x-www-form-urlencoded
内容类型标头发出POST请求,如下所示:
login(username, password): Observable<any> {
return this.http.post('/login', {
username: username,
password: password
},
{
headers: new HttpHeaders()
.set('Content-Type', 'x-www-form-urlencoded')
}
);
不幸的是我的API说我发送了空用户名和密码。
所以我决定向我的登录端点发一个邮递员请求,看看问题来自哪里,邮递员请求确实返回了用户名和密码。
当我从邮递员发布时,我的API会返回我的用户名和密码,当我从Angular应用程序发布时,我的API会返回空值吗?有什么我想念的吗?
答案 0 :(得分:83)
您将JSON数据发布到API而不是表单数据。 下面的代码段应该有用。
login(username, password): Observable<any> {
const body = new HttpParams()
.set('username', username)
.set('password', password);
return this.http.post('/login',
body.toString(),
{
headers: new HttpHeaders()
.set('Content-Type', 'application/x-www-form-urlencoded')
}
);
}
答案 1 :(得分:6)
比这里介绍的其他方法更简单。
这是我在Angular 7中使用的方法:
locations.get("/")
{
request -> Future<View> in
let title = "Events (Active and Inactive)"
return Location.query(on:request).sort(\.name).all().flatMap(to: View.self) {
locations in
let context = AllLocationsContext(title: title, hideInactiveLocations: hideInactiveLocations, locations: locations)
return try request.view().render("locations",context)
}
}
无需使用此方法显式设置标头。
请注意,HttpParams对象是不可变的。因此,执行以下操作将无法正常工作,这将给您带来空白:
const payload = new HttpParams()
.set('username', username)
.set('password', password);
this.http.post(url, payload);
答案 2 :(得分:0)
您也可以从对象加载数据
login(username, password): Observable<any> {
const body = new HttpParams({
fromObject: {
username,
password,
...extraData, // if any
}
});
return this.http.post('/login',
body.toString(),
{
headers: new HttpHeaders()
.set('Content-Type', 'application/x-www-form-urlencoded')
}
);
}
答案 3 :(得分:-2)
您可以按照以下方式发布帖子请求。
login(email:string, password:string):Observable<User>{
let headers = new HttpHeaders();
headers = headers.set('Content-Type', 'application/x-www-form-urlencoded')
let params = new HttpParams().set('user', JSON.stringify({email: email,password:password}));
return this.http.post<User>(`${MEAT_API_AUX}/login`,
{},{headers: headers,params:params})
.do(user => this.user = user);
}
之后你必须订阅。