Как разместить объект json с помощью Http.post (Angular 2) (на стороне php-сервера)

Я пытаюсь воссоздать Разместите JSON от angular 2 до php но это не работает, так как в $_REQUEST переменная на стороне 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?

Редактировать:

После долгих консультаций с экспертами по Angular / Javascript они считают, что это проблема php. Поэтому любой, кто знает, как принимать объекты 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 декодировать для значений, которые вы получаете в параметрах.

4

Другие решения

Похоже, что-то не так с кодом 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)
1