example - Cómo publicar un objeto json con Http.post(Angular 2)(lado del servidor php)
http post angular 4 (2)
Estoy intentando recrear Post JSON desde angular 2 a php, pero no funciona, ya que no hay nada en la variable $_REQUEST
en php side
El código:
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);
}
¿Se me escapa algo? Sé que las publicaciones funcionan con otro formato porque tengo esa respuesta en otra pregunta.
Además, ¿es http.request
mejor que http.post
?
Editar:
Después de mucha consulta con expertos de Angular / Javascript, creen que se trata de un problema de php. Entonces, cualquier persona con conocimiento de cómo aceptar objetos JSON en php side será bienvenido.
No parece haber ningún problema con el código angular. El problema está en lo que el PHP espera recibir. No soy un experto en PHP, pero como mencionó que funciona bien con jQuery, eso indica que su PHP espera un valor codificado en la URL (ya que jQuery tiende a funcionar con eso), no un valor JSON.
En otras palabras, lo que el servidor intenta analizar es:
search=person
Lo que estás enviando es:
{ "search": "person" }
Pruebe algo más como el siguiente para enviarlo en el formato que desea:
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)
angular 2 parte lateral del cliente
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'');
}
}
El lado del servidor PHP se asegura de que en el lado del servidor tenga estas tres líneas en el código php.
header(''Access-Control-Allow-Origin: *'');
header(''Access-Control-Allow-Headers: X-Requested-With'');
header(''Access-Control-Allow-Methods: POST, GET, OPTIONS'');
Archivo 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);
}
?>
Espero que esto funcione para ti. Para json, supongo que debes pasar como opciones y usar la decodificación json para los valores que obtienes en las opciones.