繁体   English   中英

Angular2 http.post表单值到php服务器

[英]Angular2 http.post form value to php server

我正在尝试将表单值从Ionic2(Angular2 typescript)项目发送到我将发送联系邮件的php服务器。

我无法得到我应该得到的价值......

这是我的form.service.ts:

import {Injectable}               from 'angular2/core';
import {Http, Response}           from 'angular2/http';
import {Headers, RequestOptions}  from 'angular2/http';
import {Observable}               from 'rxjs/Observable';

@Injectable()
export class FormService {
  constructor (private _http: Http) {}

  private _contactUrl = 'http://localhost:8888/Server/email.php';
  // private _contactUrl = '/email';

  sendMail(value: Object): Observable<any> {
    const body = JSON.stringify(value);
    let headers = new Headers();
    headers.append('Content-Type', 'application/x-www-urlencoded');
    return this._http.post(this._contactUrl, body, {
      headers : headers
    }).map(res => res.json());
  }
}

我的form.ts中的onSubmit函数使用了哪个:

import { Page, NavController } from 'ionic-angular';
import { Component } from 'angular2/core';
import { FORM_DIRECTIVES, FormBuilder,  ControlGroup, Validators, AbstractControl } from 'angular2/common';
import { Http, Response, Headers } from 'angular2/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/Rx';
import { FormService} from './form.service';

@Page({
    templateUrl: 'build/pages/form/form.html',
    directives: [FORM_DIRECTIVES],
    providers: [FormService]
})

export class Form {

  contactForm: ControlGroup;
  company: AbstractControl;
  name: AbstractControl;
  prenom: AbstractControl;
  phone: AbstractControl;
  email: AbstractControl;
  website: AbstractControl;
  message: AbstractControl;

  arrivee: AbstractControl;
  projet: AbstractControl;

  projets = [
    { id: 1, label: 'Site Internet' },
    { id: 2, label: 'Site Intranet/Extranet' },
    { id: 3, label: 'Développement PHP' },
    { id: 4, label: 'Développement C#' },
    { id: 5, label: 'Conception Base de Données' },
    { id: 6, label: 'Tiers Maintenance Applicative' },
    { id: 7, label: "Recrutement d'un collaborateur Handicapé" }
  ];
  arrivees = [
    { id: 1, label: 'Internet' },
    { id: 2, label: 'Recommandation' },
    { id: 3, label: 'Evênement' }
  ];

  response: string;
  value: any;

  constructor(public nav: NavController, fb: FormBuilder, private _http: Http, private _formService: FormService) {
        this.nav = nav;

        // New controlGroup instance
        this.contactForm = fb.group({
          // Validators Rules for each field
          // Champ XXX: ['', ...] correspondants au [ngFormControl]="XXX" de la vue HTML (inpput)
          name: ['', Validators.compose([Validators.required, Validators.minLength(3), this.checkFirstCharacterValidator])],
          prenom: ['', Validators.compose([Validators.minLength(3), this.checkFirstCharacterValidator])],
          company: ['', Validators.compose([Validators.required, Validators.minLength(3), this.checkFirstCharacterValidator])],
          projet: ['', Validators.required],
          arrivee: ['', Validators.required],
          phone: ['', Validators.compose([Validators.required, Validators.minLength(10)])],
          email: ['', Validators.required],
          website: ['', Validators.minLength(3)],
          message: ['', Validators.compose([Validators.required, Validators.minLength(20)])]
        });

    this.name =     this.contactForm.controls['name'];
    this.prenom =   this.contactForm.controls['prenom'];
    this.company =  this.contactForm.controls['company'];
    this.projet =   this.contactForm.controls['projet'];
    this.arrivee =  this.contactForm.controls['arrivee'],
    this.phone =    this.contactForm.controls['phone'],
    this.email =    this.contactForm.controls['email'],
    this.website =  this.contactForm.controls['website'],
    this.message =  this.contactForm.controls['message']
  }

// Check if firt character is a number
  checkFirstCharacterValidator(control: Control): { [s: string]: boolean } {
      if (control.value.match(/^\d/)) {
          return { checkFirstCharacterValidator: true };
      }
  }

  onSubmit(value) {
    this._formService.sendMail({value})
      .subscribe(
        response => this.response = response,
        error => console.log(error)
      );
  }
}

在我的email.php文件中,我正在尝试获取POST:

<?php
header('Content-type: application/json');

    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
            header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
            header("Access-Control-Allow-Headers:        {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
        exit(0);
    }

$value = json_decode(file_get_contents('php://input'));

// for test     
echo $value->name;

?>

我检查了chrome的控制台,我得到的东西: 来自控制台的屏幕截图

我怎样才能将angular2的帖子发送到我的php中? 我错过了什么吗?

我可以在你的代码中看到两个问题:

  • 使用JSON.stringify创建JSON内容但是对于表单,您需要使用URLSearchParams类或手动创建字符串内容。
  • 您的内容类型值不正确。 它是application/x-www-form-urlencoded而不是application/x-www-urlencoded

以下是您应该使用的内容:

sendMail(value: Object): Observable<any> {
  const body = new URLSearchParams();
  Object.keys(value).forEach(key => {
    body.set(key, value[key]);
  }

  let headers = new Headers();
  headers.append('Content-Type',
     'application/x-www-form-urlencoded');
  return this._http.post(this._contactUrl, body.toString(), {
    headers : headers
  }).map(res => res.json());
}

我设法让它工作,它只是:

  sendMail(value: any): Observable<any> {
    const body = new URLSearchParams(value);
    body.set('name', value.name);
    body.set('company', value.company);
    body.set('projet', value.projet);
    body.set('arrivee', value.arrivee);
    body.set('phone', value.phone);
    body.set('email', value.email);
    body.set('website', value.website);
    body.set('message', value.message);
    body.set('name', value.name);

    let headers = new Headers();
    headers.append('Content-Type', 'application/x-www-form-urlencoded');
    return this._http.post(this._contactUrl, body.toString(), {
      headers : headers
    }).map(res => res.json());
  }

并在form.php中:

<?php header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: X-Requested-With');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');

$formData = json_decode(file_get_contents('php://input'));
    foreach ($formData as $key=>$value) {
        $_POST[$key]=$value;
    }

$formObject = $_POST['name'];
(...) ?>

感谢Thierry Templier的宝贵帮助。

也许对某人来说它会很有用。 我遇到嵌套对象的问题 - 传递给这样的PHP对象:

var obj = {
        value: 1,
        innerObj: {
            title: "title",
            innerObject: {
                value: 1
            }
        }
    };

我通过使用查询字符串解析器解决了它

使用示例:

//at top of you .ts file
let qs = require('qs');

return this.http.post(url, qs.stringify(data), {headers: this.postHeader})
    .map((resp: Response) => resp.json())
    .catch((error: any) => Observable.throw(error) || 'Server error');

它对于非嵌套对象也很有用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM