使用x-www-form-urlencoded

时间:2017-10-12 16:21:06

标签: angular

我正在尝试使用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会返回空值吗?有什么我想念的吗?

4 个答案:

答案 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);
}
之后你必须订阅。