如何使用Http.post(Angular 2)发布json对象(php服务器端)
我正在尝试重新创建,但它不起作用,因为php端的如何使用Http.post(Angular 2)发布json对象(php服务器端),php,json,angular,typescript,angular2-http,Php,Json,Angular,Typescript,Angular2 Http,我正在尝试重新创建,但它不起作用,因为php端的$\u请求变量中没有任何内容 守则: searchHttp({body}: any): Promise<any> { let headers = new Headers ({ 'Content-Type': 'application/json' }); let options = new RequestOptions({ headers: headers, method: "post" }); let t
$\u请求
变量中没有任何内容
守则:
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);
}
searchHttp({body}:any):承诺
{
let headers=新的头({'Content-Type':'application/json'});
let options=newrequestoptions({headers:headers,方法:“post”});
让测试_this={“search”:“person”};
返回this.http.post(this.post\u url、JSON.stringify(test\u this)、options)
.toPromise()
。然后(响应=>
{
返回response.text();
})
.接住(这个.把手错误);
}
有什么我遗漏的吗?我知道帖子是用另一种格式写的,因为我在另一个问题中回答了这个问题
另外,http.request
比http.post
好吗
编辑:
在与Angular/Javascript专家进行了大量咨询后,他们认为这是一个php问题。因此,任何了解如何在php端接受JSON对象的人都会受到欢迎。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)
角度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") );
}
}
呼叫服务.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);
}
?>
您可以取消请求选项。没用。您正在使用的已经是默认值。我不使用php,但您确定这不仅仅是一个php问题吗?你看起来很好。也许你想发布一个php问题。不,php工作得很好,因为如果我使用jquery的Ajax,它会按预期返回结果。我根据之前的答案(你是其中的一部分)找到了一个解决办法。如果有人有更好的答案,我就把它留在这里,如果你说的是,那不是发送JSON。如果没有将jquery配置为JSON,那么jquery的默认数据类型是application/x-www-form-urlencoded。谷歌如何用jquery发送JSON,然后再去做。如果这个角度代码失败,我相信它也会失败。那么Google如何用phpI接受JSON就知道数据类型:'JSON'
是格式。这是为了我正在测试的其他东西。您在php上接受json并使用json\u decode
no?对于Ajax发送JSON,我想我以后会用谷歌搜索。是的,可能是php方面,你知道JSON格式吗?嗯,对php几乎一无所知。在这个问题上打一个PHP标签,你可能会吸引到合适的专家。我知道如何通过带有问号的get
方法来实现。只需要知道如何使用JSON格式,您可以试试$str_JSON=file_get_contents('php://input'); 在服务器端php上。这将读取原始POST数据。对你来说可能有用。读一读。