【问题标题】:Prepare the body of an Http post request from an object准备来自对象的 Http post 请求的主体
【发布时间】:2017-11-24 15:42:39
【问题描述】:

要以角度发送 http post 请求的正文,我使用以下实现:

  let requestBody: String = "";

  //dataObjectis the object that contains the values to send from the form
  for (let key in dataObject) {
    if (dataObject[key]) {
      requestBody += (body.length ? '&' : '') + key + "=" + dataObject[key];
    }
  }

然后我在我的http post请求中使用requestBody,如下所示:

let headers = new Headers();
headers.append('Content-Type', 'application/x-www-form-urlencoded');
let requestOptions = new RequestOptions({ headers: headers });
//http is an Http instance
http.post(URI, requestBody, requestOptions)

我想知道是否有更好的方法或“准备使用”方法允许在 post 方法中直接使用对象 dataObject 而不是使用上述实现。

【问题讨论】:

  • 你可以试试 JSON.stringify() ;)
  • 我认为 JSON.stringify() 不适用于 application/x-www-form-urlencoded Content-Type(我刚刚编辑了我的问题以添加 Content-Type)
  • 您可以“发布”许多不同类型的数据。您是否考虑过发布“应用程序/json”内容类型?如果你的 dataObject 已经是 JavaScript Object 类型,则无需将其转换为表单数据。

标签: angular typescript http-post httprequest


【解决方案1】:

我不知道是否有已弃用的 Http 模块的方法。新的 HttpClient 支持这个。

constructor(http: HttpClient) {
    let headers = new HttpHeaders();
    headers = headers.append('Content-Type', 'application/x-www-form-urlencoded');

    let params = new HttpParams()
    params = params.set('a', '1')
    http.post('/api/v1/login', params, {headers: headers}).subscribe(res => {});

}

【讨论】:

  • post 方法的第二个参数应该是请求的正文。如果请求有参数,不应该在post方法的第三个参数内发送吗?
  • 如果您想将参数作为 Post Form 数据发送,它们属于方法的主体部分,因为它们是请求的主体。如果您想将它们作为 Url Params 发送,您必须将它们放入第三个参数的对象中,并使用关键参数 {headers: headers, params: params}
【解决方案2】:

试试URLSearchParams:

import { URLSearchParams } from '@angular/http';

//...

let requestBody = new URLSearchParams();

for (let key in dataObject) {
  requestBody.set(key, dataObject[key]);
}

【讨论】:

    猜你喜欢
    • 2014-01-25
    • 2021-01-25
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    相关资源
    最近更新 更多