2016-12-15 80 views
4

我试图重新Post JSON from angular 2 to php,但它不工作,因为没有什么在$_REQUEST变量在PHP侧如何发布JSON对象与Http.post(角2)(PHP服务器端)

代码:

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

编辑:

与角/ JavaScript的专家会诊多后,他们认为这是一个PHP的问题。所以任何知道如何在PHP端接受JSON对象的人都会很乐意接受。

+0

您可以摆脱请求选项。没用的。你正在使用的是默认设置。我不使用PHP,但你确定这不仅仅是一个PHP的问题?你的角码很好。也许你想发布一个PHP的问题,而不是。 –

+0

nope,php工作正常,因为如果我使用jQuery的Ajax它会按预期返回结果。我从前一个答案(你是其中一部分)处理了一项工作,请参阅... http://stackoverflow.com/questions/41135595/using-json-objects-in-urlsearchparams/41135641?noredirect=1#comment69475362_41135641 。虽然如果有人有更好的答案,我会留在这里 –

+0

如果你在谈论[这个jQuery](http://stackoverflow.com/q/41132472/2587435),那不是发送JSON。如果您没有为JSON配置它,jquery的默认数据类型是application/x-www-form-urlencded。谷歌如何发送JSON与jQuery,然后做到这一点。我相信它也会失败,如果这个角码失败了。然后谷歌如何接受JSON与PHP –

回答

4

角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解码你的选项得到的值。

+0

我知道如何通过带问号的get方法来实现。只需要知道如何做JSON格式 –

+1

你可以试试$ str_json = file_get_contents('php:// input');在服务器端的PHP。这读取原始的POST数据。它可能适用于你的情况。阅读它。 –

+1

'php:// input'工作 –

1

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) 
+0

是的,它可能是PHP方面,你知道任何关于预期JSON格式? –

+0

对PHP几乎毫无头绪。在这个问题上敲一个PHP标签,你可能会吸引合适的专家。 – Mitch