【问题标题】:How to post json object with Http.post (Angular 2) (php server side)如何使用 Http.post (Angular 2) (php 服务器端) 发布 json 对象
【发布时间】:2017-04-30 11:23:55
【问题描述】:

我正在尝试重新创建 Post JSON from angular 2 to php,但它不起作用,因为 php 端的 $_REQUEST 变量中没有任何内容

代码:

searchHttp({body}: any): Promise<any>
{   
    let headers = new Headers ({ 'Content-Type': 'application/json' });
    let options = new RequestOptions({ headers: headers, method: "post" });

    let test_this = {"search": "person"};

    return this.http.post(this.post_url, JSON.stringify(test_this), options)
        .toPromise()
        .then(response =>  
            {   
                return response.text();
            })  
        .catch(this.handleError);
}

我有什么遗漏吗?我知道帖子可以使用另一种格式,因为我已经在另一个问题中回答了这个问题。

另外,http.request 比 http.post 好吗?

编辑:

在与 Angular/Javascript 专家多次协商后,他们认为这是一个 php 问题。因此,任何了解如何在 php 端接受 JSON 对象的人都将受到欢迎。

【问题讨论】:

  • 你可以去掉请求选项。没用的。您使用的已经是默认设置。我不使用php,但你确定这不仅仅是一个php问题吗?你的角度代码很好。也许你想发布一个 php 问题。
  • 不,php 工作正常,因为如果我使用 jquery 的 Ajax,它会按预期返回结果。我从以前的答案(你是其中的一部分)解决了一个问题,请参阅...stackoverflow.com/questions/41135595/…。虽然如果有人有更好的答案,我会留在这里
  • 如果你在谈论this jquery,那不是发送 JSON。 jquery 的默认数据类型是 application/x-www-form-urlencded,如果您没有为 JSON 配置它。谷歌如何用 jquery 发送 JSON,然后去做。如果这个角度代码失败,我相信它也会失败。然后谷歌如何用php接受JSON
  • 我知道dataType: 'json'是格式。那是为了我正在测试的其他东西。
  • 你接受 php 上的 json json_decode 不?而对于 Ajax 发送 JSON,我想我会在以后谷歌它。

标签: php json angular typescript angular2-http


【解决方案1】:

angular 2 客户端部分

 ngOnInit() { 

        let body=Api+'product.php'+'?id=' + this.link_id;
        this._callservice.callregister(body)
                    .subscribe( data => {
                                this.outputs=data;                           
                       }, 
                    error => console.log("Error HTTP Post"),
                    () => console.log("completed") );  
      }    
    }

call.service.ts

import {Injectable} from '@angular/core';
import {Router} from '@angular/router';
import {Http, Response, Headers, RequestOptions} from '@angular/http';
import {Observable}     from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';

@Injectable()
export class AuthenticationService {

  constructor(private _http:Http){}

  postregister(api:any){
//      console.log(api);
  let headers = new Headers({'Content-Type':'application/x-www-form-urlencoded'});
  let options = new RequestOptions({ headers: headers, method: "post"});
      return this._http.get(api,options)
          .map(res => res.json())
          .catch(this.handleError);
  }
  private handleError (error: Response) {
        console.error(error);
        return Observable.throw(error.json().error || ' error');
    }

}

服务器端 PHP 确保在服务器端你在 php 代码中有这三行。

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

php 文件:

  <?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: X-Requested-With');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
$servername = "localhost";
$username1 = "root";
$password = "root";
$dbname = "product";

$e=array("error"=>1,"message"=>"Account Already Exists");

$accountCreated = array( "error" =>0, 
                         "data" => array(
                                   "username" => "amit" , 
                                   "password" => "anypassword",
                                   "role"=> "user", 
                                   "id" => "anyid" ) );

// Create connection
$conn = mysqli_connect($servername, $username1, $password, $dbname);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

    $username = $_GET["username"];
    $Pass = $_GET["password"];
    $role= $_GET["role"];
    $sql="SELECT COUNT(*) as user FROM users WHERE username = '$username'";
    $result = mysqli_query($conn,$sql);
    $line = mysqli_fetch_assoc($result);
    $count = $line['user'];
    if($count!=0)
       {
          echo json_encode($e);
       }
    else
       {
         $sql="INSERT INTO users(username,password,role)VALUES('$username','$Pass','$role')";
         $result=mysqli_query($conn,$sql);
         $sql="select * from users where username ='$username'";
         $result=mysqli_query($conn,$sql);
         $line=mysqli_fetch_assoc($result);
         {
             $accountCreated['data']['username']=$line['username'];
             $accountCreated['data']['password']=$line['password'];
             $accountCreated['data']['role']=$line['role'];
             $accountCreated['data']['id']=$line['id'];
         }
         echo json_encode($accountCreated);
        }

 ?>

我希望这对你有用.. 对于 json,我想你应该作为选项传递,并使用 json 解码来获取你在选项中获得的值。

【讨论】:

  • 我知道如何通过带有问号的get 方法来做到这一点。只需要知道如何处理 JSON 格式
  • 你可以试试 $str_json = file_get_contents('php://input');在服务器端 php。这会读取原始 POST 数据。它可能适用于您的情况。阅读它。
【解决方案2】:

Angular 代码似乎没有任何问题。问题在于 PHP 期望收到的内容。我不是 PHP 专家,但正如您提到的,它与 jQuery 一起工作正常,那么这表明您的 PHP 需要一个 URL 编码的值(因为 jQuery 倾向于使用它),而不是 JSON 值。

换句话说,服务器试图解析的是:

search=person

您发送的是:

{ "search": "person" }

尝试以下类似的方式,以您想要的格式发送:

let test_this = { "search": "person" };
let headers = new Headers ({ 'Content-Type': 'application/x-www-form-urlencoded' });
let options = new RequestOptions({ headers: headers, method: "post" });

http.post(this.post_url, test_this, options)

【讨论】:

  • 是的,它可能是 php 方面,你知道什么期望 json 格式吗?
  • 嗯,对 PHP 几乎一无所知。不过,在这个问题上打一个 PHP 标签,你可能会吸引到合适的专家。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 2016-08-09
  • 2013-06-08
  • 1970-01-01
相关资源
最近更新 更多