Angular4 - 将表单数据发布到api

时间:2017-06-14 20:40:15

标签: javascript angular typescript

如何将表单数据发布到外部rest api?

目前我有一个HTML格式:

<form [formGroup] = "form" (ngSubmit) = "onSubmit(form.value)">
  <input name="name" formControlName="name">
  <input name="first_name" formControlName="first_name">
  <input name="last_name" formControlName="last_name">
  <button type="submit">Save</button>
 </form>

然后我有我在component.ts文件中处理提交的函数:

  onSubmit = function (user) {
    console.log(user);
    //this.http.post('http://xxx/externalapi/add', user);
  }

但是如何将表单数据发布到我的外部api呢?使用angular发送表单数据的标准是什么?它只是一个简单的post请求,表单数据为queryParams,或者将其转换为JSON是标准的。我可以修改api来处理发送的数据,这不是问题。

5 个答案:

答案 0 :(得分:15)

制作通用Post&amp;使用表单数据

的角度为2/4的Get方法
import { Http, Response, Headers, RequestOptions } from '@angular/http'; 
import { Observable } from 'rxjs/Observable';

constructor(private _http: Http) { }

get(url: string): Observable < any > {
    return this._http.get(url)
             .map((response: Response) => <any>response.json()); 
}

post(url: string, model: any): Observable <any> {
    let formData: FormData = new FormData(); 
    formData.append('id', model.id); 
    formData.append('applicationName', model.applicationName); 
    return this._http.post(url, formData)
        .map((response: Response) => {
            return response;
        }).catch(this.handleError); 
}

答案 1 :(得分:10)

好的,所以事实证明我必须添加.subscribe()来发布它做某事。 此外,如果我出于某种原因将“用户”直接放入发布请求中,它会发送一个请求,其方法为“OPTIONS”而没有正文。所以我必须自己创建一个queryParams字符串。如果任何人都可以解释这个或显示更好的方法来做到这一点,我会赞美它。否则这当前有效:

 onSubmit = function (user) {
    console.log(user);

    var body = "firstname=" + user.firstname + "&lastname=" + user.lastname + "&name=" + user.name;
    this.http.post("http://www.testtttt.com", body).subscribe((data) => {});

  }

编辑:另一个甚至更好的解决方案是使用JSON.stringify(用户)而不是body。但是仍然需要订阅()。

答案 2 :(得分:3)

如何使用Typescript让您的生活更轻松?

html具有ngModel双向绑定。我已更改为重命名表单personForm。您可以添加验证,但我已在此处跳过它。

 <form #personForm="ngForm"(ngSubmit)="onSubmit(personForm.value)">     
  <input name="firstName" [(ngModel)]="firstName">
  <input name="lastName" [(ngModel)]="lastName">
  <button type="submit">Save</button>
 </form>

在组件上,您可以使用可在models文件夹中定义的接口Person。内容看起来像这样。

export interface Person {
  id:number;
  firstName: string;
  lastName: string;
}

然后在提交方法中,您可以自动映射,如下所示。

onSubmit(person: Person){
  http.post('your_url', person).subscribe(status=> console.log(JSON.stringify(status)));
}

看看类型安全有多容易?您还可以检查是否填充了ID,并根据您是要更新此人还是删除来发出“PUT”或“DELETE”请求。

答案 3 :(得分:0)

要将数据发布到其余api,您需要像这样对数据变量进行量化

onSubmit = function (user) {
console.log(user.value);

var data= {
"name": user.value.name,
"first_name": user.value.first_name,
"last_name": user.value.last_name,
"creator_email": user.value.email,
}

return this.http.post("http://www.your/api/here.com", data, 
{headers:headers}).subscribe(
(res)=>{
 // console.log('success');
console.log(res);
},
err=>{
console.log(" Error..");
 } 
 );

答案 4 :(得分:0)

由于我没有足够的声誉来发表评论,请允许我为接受的答案做出贡献。您可以执行以下操作,而不是将所有表单输入一个接一个地放入模型中

var model = this.forContollname.value

然后您可以拨打以下电话

 var values = JSON.stringify(model)

然后可以将值传递到post方法中。 我希望这可以简化大型表单的处理过程。