Angular 2 http post params and body

时间:2017-06-15 13:55:35

标签: angular angular-http

我试图通过我的角度应用程序进行api调用。我想要做的是使用命令参数向api发送一个post请求。我做了很多服务器端测试以及完成传出请求,$_POSTbody数据永远不存在。因此,我很确定这个问题存在于这段代码中。

public post(cmd: string, data: object): Observable<any> {

    const params = new URLSearchParams();
    params.set('cmd', cmd);

    const options = new RequestOptions({
      headers: this.getAuthorizedHeaders(),
      responseType: ResponseContentType.Json,
      params: params,
      body: data,
      withCredentials: false
    });

    console.log('Options: ' + JSON.stringify(options));

    return this.http.post('http://t2w.dev/index.php', data, options)
      .map(this.handleData)
      .catch(this.handleError);
  }

我尝试了许多不同的JSON结构data,但这是我要发送的内核的核心:

{
  "Username": "No thanks",
  "Password": "Donno"
}

this.handleDatathis.handleError是一种将数据和错误作为参数的方法,并返回我想要的内容。

api被设置为记录通过$_POST传递的任何内容,除了我的角度应用程序之外,它可以在任何地方运行请求时正常工作。到目前为止我做了什么:

  1. 传递原始查询而不是URLSearchParams
  2. 无需传递请求。
  3. 传递RequestOptions中的所有值。
  4. 将params作为字符串传递。
  5. 将身体作为params传递。
  6. 将正文传递为JSON.stringify({ &#34;用户名&#34;:&#34;不,谢谢&#34;, &#34;密码&#34;:&#34; Donno&#34; }
  7.   

    RequestOptions

    的控制台输出      

    选项:{&#34;方法&#34;:null,&#34;标题&#34;:{&#34;内容类型&#34;:[&#34; application / json&#34;] &#34;接受&#34;:[&#34;应用/ JSON&#34],&#34; X-CLIENT-ID&#34;:[&#34; 380954038&#34],&#34 X-CLIENT-SECRET&#34;:[&#34; 5BgqRO9BMZ4iocAXYjjnCjnO7fHGN59WP8BTRZ5f&#34;]}&#34;主体&#34;:&#34; {}&#34;&#34; URL&#34; :空,&#34; PARAMS&#34; {&#34; rawParams&#34;:&#34;&#34;&#34; queryEncoder&#34;:{},&#34; paramsMap&#34 ;:{}},&#34; withCredentials&#34;:假,&#34;的responseType&#34;:1}   VM8529:1 XHR已完成加载:POST&#34; http://t2w.dev/index.php&#34;。

    任何人都知道为什么数据永远不会被发送?

5 个答案:

答案 0 :(得分:8)

http.post的第二个参数是消息的主体,即有效负载而不是url搜索参数。在该参数中传递data

来自the documentation

  

post(url: string, body: any, options?: RequestOptionsArgs) : Observable<Response>

public post(cmd: string, data: object): Observable<any> {

    const params = new URLSearchParams();
    params.set('cmd', cmd);

    const options = new RequestOptions({
      headers: this.getAuthorizedHeaders(),
      responseType: ResponseContentType.Json,
      params: params,
      withCredentials: false
    });

    console.log('Options: ' + JSON.stringify(options));

    return this.http.post(this.BASE_URL, data, options)
      .map(this.handleData)
      .catch(this.handleError);
  }

修改

您还应该查看第一个参数(BASE_URL)。它必须包含您要访问的完整URL(减去查询字符串)。我提到的是由于你给它的名字,我只能猜出当前的价值(也许只是域名?)。

此外,无需在http主体中发送的数据/有效负载上调用JSON.stringify

如果仍然无法达到终点,请查看开发控制台中浏览器的网络活动,以查看正在发送的内容。然后,您可以进一步确定是否使用正确的标题和正文调用正确的结束点。如果它看起来是正确的,那么使用POSTMAN或Fiddler或类似的东西来看看你是否可以用这种方式命中你的端点(在Angular之外)。

答案 1 :(得分:7)

它有效,谢谢@trichetriche。问题发生在我的RequestOptions,显然,在使用帖子时,您无法将paramsbody传递给RequestOptions。删除其中一个给我一个错误,删除它们并且它的工作原理。仍然没有最终解决我的问题,但我现在有一些工作要做。最终的工作代码。

public post(cmd: string, data: string): Observable<any> {

    const options = new RequestOptions({
      headers: this.getAuthorizedHeaders(),
      responseType: ResponseContentType.Json,
      withCredentials: false
    });

    console.log('Options: ' + JSON.stringify(options));

    return this.http.post(this.BASE_URL, JSON.stringify({
      cmd: cmd,
      data: data}), options)
      .map(this.handleData)
      .catch(this.handleError);
  }

答案 2 :(得分:0)

让我们说我们的后端看起来像这样:

2000 > 1000

我们有一个像这样的HttpService:

public async Task<IActionResult> Post([FromBody] IList<UserRol> roles, string notes) {
}

以下是我们如何将正文和注释作为参数传递的方法:     //如何调用

    post<T>(url: string, body: any, headers?: HttpHeaders, params?: HttpParams): Observable<T> {
        return this.http.post<T>(url, body, { headers: headers, params});
    }

它对我有用(使用7角),希望对某人有用。

答案 3 :(得分:-1)

是的问题在这里。它与您的语法有关。

尝试使用此

return this.http.post(this.BASE_URL, params, options)
  .map(data => this.handleData(data))
  .catch(this.handleError);

而不是

return this.http.post(this.BASE_URL, params, options)
  .map(this.handleData)
  .catch(this.handleError);

此外,第二个参数应该是正文,而不是url参数。

答案 4 :(得分:-2)

好像你使用Angular 4.3版本,我也遇到了同样的问题。使用Angular 4.0.1并使用@trichetricheand发布代码,它将起作用。我也不确定如何在Angular 4.3上解决它:S