如何发布JSON对象与Http.post(角2)(PHP服务器端)
我试图重新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对象的人都会很乐意接受。
角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数据。它可能适用于你的情况。阅读它。 –
'php:// input'工作 –
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标签,你可能会吸引合适的专家。 – Mitch
您可以摆脱请求选项。没用的。你正在使用的是默认设置。我不使用PHP,但你确定这不仅仅是一个PHP的问题?你的角码很好。也许你想发布一个PHP的问题,而不是。 –
nope,php工作正常,因为如果我使用jQuery的Ajax它会按预期返回结果。我从前一个答案(你是其中一部分)处理了一项工作,请参阅... http://stackoverflow.com/questions/41135595/using-json-objects-in-urlsearchparams/41135641?noredirect=1#comment69475362_41135641 。虽然如果有人有更好的答案,我会留在这里 –
如果你在谈论[这个jQuery](http://stackoverflow.com/q/41132472/2587435),那不是发送JSON。如果您没有为JSON配置它,jquery的默认数据类型是application/x-www-form-urlencded。谷歌如何发送JSON与jQuery,然后做到这一点。我相信它也会失败,如果这个角码失败了。然后谷歌如何接受JSON与PHP –