【问题标题】:How to send form data in a http post request of angular 2?如何在 Angular 2 的 http post 请求中发送表单数据?
【发布时间】:2017-04-23 05:57:27
【问题描述】:

我正在尝试将更新的用户详细信息的表单数据发送到 Angular 2 中的节点服务器的后端,但是我无法发送表单数据并且服务器响应状态为 500,在 angularjs 中我做了一些事情像这样, 服务文件

  update: {
    method: 'POST',
    params: {
      dest1: 'update'
    },
    transformRequest: angular.identity,
    'headers': {
      'Content-Type': undefined
    }
  }

在控制器中

var fd = new FormData();
var user = {
  _id: StorageFactory.getUserDetail()._id,
  loc: locDetails
};
fd.append('user', angular.toJson(user));
UserService.update(fd).
$promise.then(
  function(value) {
    console.info(value);
    updateUserDetailsInStorage();
  },
  function(err) {
    console.error(err);
  }
);

我不知道如何在 angular 2 中执行此操作,因为 angular.toJson、angular.identity 和 transformrequest 功能在 angular 2 中不可用, 到目前为止,我在角度 2 中完成了以下操作,

 let fd = new FormData();
 let user = {
   _id: this.appManager.getUserDetail()._id,
   loc: locDetails
 };
 fd.append('user', JSON.stringify(user));
 this.userService.update(fd).subscribe((value) => {
   console.log(value);
   this.updateUserDetailsInStorage();
 }, (err) => {
   console.error(err);
 });

http服务文件

update(body) {
  console.log('update', body);
  const headers = new Headers({
    'Content-Type': undefined
  });

  const options = new RequestOptions({
    headers: headers
  });
  return this.http.post(`${app.DOMAIN}` + 'user/update', body, options)
    .map((res: Response) => {
      res.json();
    }).do(data => {
      console.log('response', data);
    })
}

我已经阅读了很多帖子并尝试了一些事情,但到目前为止都没有成功,谁能建议我如何做到这一点?

【问题讨论】:

  • 你到底哪里失败了?控制台有错误吗?
  • 没有控制台错误,服务器以 500 状态响应,而当我运行我在 angularjs 中创建的相同应用程序时,它可以正常工作
  • 如果您确定发布的 url 是正确的,您还可以 JSON.stringify 您发送的正文变量吗?并且可能将“Content-Type”更改为“application/json”
  • 当我尝试其中一个或两个时,请求负载变为 {}

标签: javascript angular multipartform-data form-data


【解决方案1】:

如果您的服务器控制器需要,您可以添加标头,否则您可以像这样简单地发布它

let body = new FormData();
body.append('email', 'emailId');
body.append('password', 'xyz');
this.http.post(url, body);

【讨论】:

【解决方案2】:

这是在 Angular2 中构建 POST 请求的功能解决方案,您不需要 Authorization 标头。

var headers = new Headers();
headers.append('Content-Type', 'application/x-www-form-urlencoded');

let options = new RequestOptions({ headers: headers });

var body = "firstname=" + user.firstname + "&lastname=" + user.lastname + "&username=" + user.username + "&email=" + user.email + "&password=" + user.password;

return new Promise((resolve) => {
                this.http.post("http://XXXXXXXXXXX/users/create", body, options).subscribe((data) => {
                if (data.json()) {
                    resolve(data.json());
                } else {
                    console.log("Error");
                }
            }
        )
    });

【讨论】:

  • 实际上是'application/x-www-form-urlencoded' 而不是'application/X-www-form-urlencoded'。小写 X。在我更改之前,我收到了 400 Bad Request。
【解决方案3】:

这是我的应用程序中运行良好的方法。

 updateProfileInformation(user: User) {
    this.userSettings.firstName = user.firstName;
    this.userSettings.lastName = user.lastName;
    this.userSettings.dob = user.dob;

    var headers = new Headers();
    headers.append('Content-Type', this.constants.jsonContentType);

    var s = localStorage.getItem("accessToken");
    headers.append("Authorization", "Bearer " + s);
    var body = JSON.stringify(this.userSettings);

    return this.http.post(this.constants.userUrl + "UpdateUser", body, { headers: headers })
      .map((response: Response) => {
        var result = response.json();
        return result;
      })
      .catch(this.handleError)
  }

【讨论】:

  • 这个答案似乎没有特别解释如何发布表单数据。这看起来像一个带有普通字符串化 JSON 正文的请求。表单数据在哪里?
【解决方案4】:

这是我在 Angular 4 中用于上传文件的方法.... 为 Ui

   <input type="file"id="file"(change)="handleFileInput($event)">

和 .ts 文件我已经添加了这个 ....

  handleFileInput(event) {
    let eventObj: MSInputMethodContext = <MSInputMethodContext> event;
    let target: HTMLInputElement = <HTMLInputElement> eventObj.target;
    let files: FileList = target.files;
    this.fileToUpload  = files[0];
    console.log(this.fileToUpload);
  }



 uploadFileToActivity() {
    console.log('Uploading file in process...!' + this.fileToUpload );
    this.fontService.upload(this.fileToUpload).subscribe(
      success => {
        console.log(JSON.stringify(this.fileToUpload));
        console.log('Uploading file succefully...!');
        console.log('Uploading file succefully...!' + JSON.stringify(success));
      },
      err => console.log(err),
    );
  }

在服务中

upload(fileToUpload: File) {
    const headers = new Headers({'enctype': 'multipart/form-data'});
    // headers.append('Accept', 'application/json');
    const options = new RequestOptions({headers: headers});
    const formData: FormData = new FormData();
    formData.append('file', fileToUpload, fileToUpload.name);
    console.log('before hist the service' + formData);
    return this.http
      .post(`${this.appSettings.baseUrl}/Containers/avatar/upload/`, formData , options).map(
        res => {
          const data = res.json();
          return data;
        }
      ).catch(this.handleError);
  }

此方法用于单个文件上传到服务器目录。

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
【解决方案5】:

最终答案 像下面这样发送工作正常。

         const input = new FormData();
            input['payload'] = JSON.stringify(param);
             console.log(input);
                  alert(input);
                return this.httpClient.post(this.hostnameService.razor + 'pipelines/' + 
                    workflowId, input).subscribe(value => {
                 console.log('response for Manual Pipeline ' + value);
                 return value;
                   }, err => {
                     console.log(err);
                     }); 

【讨论】:

    猜你喜欢
    • 2019-09-15
    • 2016-04-08
    • 1970-01-01
    • 2016-03-31
    • 2021-08-18
    • 1970-01-01
    • 2021-01-13
    • 2015-09-26
    相关资源
    最近更新 更多