Я пытаюсь воссоздать Post JSON с углового 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.
угловая 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 decode для значений, которые вы получаете в опциях.
Кажется, что не что-то не так с Угловым кодом. Проблема в том, что 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)