Angular HttpClient:Post方法未正确设置参数

时间:2019-03-15 09:30:47

标签: angular ionic-framework rxjs httpclient

我的方法transmitProject(project: ProjectModel): Observable<boolean>中有一个通过HttpClient的发布请求,我想将数据发布到后端:

-我的transmitProject方法内部

const params = {
   projectId: project.projectId,
   description: documentation.description,
   // some other attributes ...
};

return this.http.post(this.conf.url, params).pipe(
   map(response => {
      console.log(response);
      return true;
   })
);

...直到这里一切正常。但是请求将发布数据设置为json格式。为了测试后端服务器,请返回转储的$ _POST变量-> null。

请求有效载荷: {projectId:“ ...”,描述:“ ...”,经度:10,纬度:10,…}

实际上应该是: projectId = ...说明= ...经度= 10纬度= 10 ...

->在Postman中,一切正常。

2 个答案:

答案 0 :(得分:3)

这里的问题是Angular默认发送JSON类型的发布请求。

您可以更改PHP后端,而可以使用$_POST来读取JSON:

<?
..
$JSON = file_get_contents("php://input");
if (!empty($JSON ))
{
  $params = json_decode($JSON, true); 
}
?>

或者,如果您真的想中继以x-www-form-urlencoded发送 您可以使用 URLSearchParams 将内容类型自动设置为application/x-www-form-urlencoded

let body = new URLSearchParams();
body.set('username', username);
body.set('password', password);

this.http.post(this.loginUrl, body).map(...);

当然,如果您像这样正确编码身体,也可以手动进行

let body = `username=${username}&password=${password}`;

但是您必须手动将标题设置为application/x-www-form-urlencoded

this.http.post(this.loginUrl, body, { headers: headers }).map(...);

答案 1 :(得分:1)

这不是很明显,但是您没有正确使用httpClient

您可以在this SO post中找到这种情况的说明。

如果您不想使用JSON,但希望坚持使用x-www-form编码,则您的代码应类似于:

const body = new HttpParams()
  .set('your property name', ** property value **)
  .set(...);

return this.http.post(this.conf.url,
  body.toString(),
  {
    headers: new HttpHeaders()
      .set('Content-Type', 'application/x-www-form-urlencoded')
  }
).pipe(... same code as you already have ...);