Json parameters van ajax naar PHP
Hallo,
ik moet data (JSON) van domein x naar domein z krijgen a.d.h.v. enkele parameters (JSON) via ajax. Hiervoor probeer ik op domein x een PHP api te schrijven die domein z kan aanspreken met ajax.
ajax op domein z:
api op domein z:
helaas blijft mijn log file dus leeg, $_POST blijkt leeg te zijn hoewel hier wel degelijk data in zou moeten zitten.
Wie kan mij helpen?
ik moet data (JSON) van domein x naar domein z krijgen a.d.h.v. enkele parameters (JSON) via ajax. Hiervoor probeer ik op domein x een PHP api te schrijven die domein z kan aanspreken met ajax.
ajax op domein z:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
$.ajax({
type: "POST",
url: url, // url= domainx.com/api/login.php
contentType: "application/json; charset=utf-8",
dataType: "json",
data: { test: "{'userName':'Jasper','password':'test'}"},
error: function (f, e, d) {
console.warn("ERROR: " + e, f, d);
},
success: serviceCallback
});
type: "POST",
url: url, // url= domainx.com/api/login.php
contentType: "application/json; charset=utf-8",
dataType: "json",
data: { test: "{'userName':'Jasper','password':'test'}"},
error: function (f, e, d) {
console.warn("ERROR: " + e, f, d);
},
success: serviceCallback
});
api op domein z:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept');
header('content-type: application/json; charset=utf-8');
date_default_timezone_set('Europe/Brussels');
$myFile = 'log.txt';
$myContent = file_get_contents($myFile);
$myContent .= "\n" . date('G:i:s') . "\n";
$myContent .= print_r(json_decode($_POST['test']) , true);
echo $_POST['test'];
file_put_contents($myFile, utf8_encode($myContent));
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept');
header('content-type: application/json; charset=utf-8');
date_default_timezone_set('Europe/Brussels');
$myFile = 'log.txt';
$myContent = file_get_contents($myFile);
$myContent .= "\n" . date('G:i:s') . "\n";
$myContent .= print_r(json_decode($_POST['test']) , true);
echo $_POST['test'];
file_put_contents($myFile, utf8_encode($myContent));
helaas blijft mijn log file dus leeg, $_POST blijkt leeg te zijn hoewel hier wel degelijk data in zou moeten zitten.
Wie kan mij helpen?
Gewijzigd op 23/12/2013 14:18:00 door Jasper DS
Deze twee lijnen
contentType: "application/json; charset=utf-8",
dataType: "json",
betekenen dat je verwacht dat de server JSON teruggeeft.
Om aan te duiden dat je JSON verstuurt, heb je die lijnen niet nodig. Dat is standaard.
JSON is de standaard manier waarop javascript objecten noteert.
Je moet dus gewoon die lijnen weglaten.
Ook die PHP headers zijn nergens voor nodig. Zelfde reden
Voor wat jij wil, volstaat dit
contentType: "application/json; charset=utf-8",
dataType: "json",
betekenen dat je verwacht dat de server JSON teruggeeft.
Om aan te duiden dat je JSON verstuurt, heb je die lijnen niet nodig. Dat is standaard.
JSON is de standaard manier waarop javascript objecten noteert.
Je moet dus gewoon die lijnen weglaten.
Ook die PHP headers zijn nergens voor nodig. Zelfde reden
Voor wat jij wil, volstaat dit
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
file_put_contents('log.txt', print_r($_POST, true));
echo 'klaar';
exit;
}
?>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>
$(document).ready(function() {
$('#klik').click(function() {
var url = 'index.php'
$.ajax({
url: url,
type: "post",
data: { test: {userName: 'Jasper', password: 'test'}},
error: function (f, e, d) {
console.warn("ERROR: " + e, f, d);
},
success: serviceCallback
});
});
function serviceCallback(response) {
$('#messages').html(response);
}
});
</script>
<input type="button" value="klik" id="klik">
<div id="messages"></div>
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
file_put_contents('log.txt', print_r($_POST, true));
echo 'klaar';
exit;
}
?>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>
$(document).ready(function() {
$('#klik').click(function() {
var url = 'index.php'
$.ajax({
url: url,
type: "post",
data: { test: {userName: 'Jasper', password: 'test'}},
error: function (f, e, d) {
console.warn("ERROR: " + e, f, d);
},
success: serviceCallback
});
});
function serviceCallback(response) {
$('#messages').html(response);
}
});
</script>
<input type="button" value="klik" id="klik">
<div id="messages"></div>
Bedankt voor je antwoord Kris, de server moet wel degelijk JSON terugsturen die door middel van de parameters uit een database gehaald moet worden. Deze code heb ik nog niet geschreven ik wil eerst kunnen kijken welke parameters er binnen komen. De Json terug sturen is geen probleem, dat werkt.
De headers zijn er omdat ik de data van een ander domein haal en als de headers er dan niet staan krijg je de error:
De headers zijn er omdat ik de data van een ander domein haal en als de headers er dan niet staan krijg je de error:
Edit:
Gewijzigd op 23/12/2013 14:53:34 door Jasper DS
Jasper DS op 23/12/2013 14:50:14:
... Deze code heb ik nog niet geschreven ik wil eerst kunnen kijken welke parameters er binnen komen. ...
Zolang de server geen JSON terug stuurt (En enkel JSON. Geen enkel ander karakter; geen echo 'test', ...) zal je in de error callback terecht komen.
---
Okay, dat verklaart nog niet waarom die file_put_contents niet werkt.
Noteer die data eens zoals ik het doe, op lijn 16 van mijn code.
Zie eens of dat helpt.
Gewijzigd op 23/12/2013 15:02:31 door Kris Peeters
Array blijft leeg maar $_POST bestaat wel
ajax
api
output in log.txt
ajax
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
$.ajax({
type: App.config('use-service-stubs', false) ? "GET" : "POST",
url: url,
contentType: "application/json; charset=utf-8",
dataType: "json",
data: { test: {userName: 'Jasper', password: 'test'}},
error: function (f, e, d) {
console.warn("ERROR: " + e, f, d);
},
success: serviceCallback
});
type: App.config('use-service-stubs', false) ? "GET" : "POST",
url: url,
contentType: "application/json; charset=utf-8",
dataType: "json",
data: { test: {userName: 'Jasper', password: 'test'}},
error: function (f, e, d) {
console.warn("ERROR: " + e, f, d);
},
success: serviceCallback
});
api
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept');
header('content-type: application/json; charset=utf-8');
date_default_timezone_set('Europe/Brussels');
$myFile = 'log.txt';
$myContent = file_get_contents($myFile);
$myContent .= "\n" . date('G:i:s') . "\n";
if($_SERVER['REQUEST_METHOD'] === 'POST')
{
if(isset($_POST))
{
$myContent .= print_r($_POST, true);
echo json_encode($_POST);
}
else
{
$myContent .= '$_POST is not defined';
echo json_encode(array('error' => 'Post is not defined'));
}
}
else
{
$myContent .= 'No server_request';
$myContent .= print_r($_POST, true);
$myContent .= print_r($_GET, true);
echo json_encode(array('error' => 'No server_request'));
}
file_put_contents($myFile, $myContent);
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept');
header('content-type: application/json; charset=utf-8');
date_default_timezone_set('Europe/Brussels');
$myFile = 'log.txt';
$myContent = file_get_contents($myFile);
$myContent .= "\n" . date('G:i:s') . "\n";
if($_SERVER['REQUEST_METHOD'] === 'POST')
{
if(isset($_POST))
{
$myContent .= print_r($_POST, true);
echo json_encode($_POST);
}
else
{
$myContent .= '$_POST is not defined';
echo json_encode(array('error' => 'Post is not defined'));
}
}
else
{
$myContent .= 'No server_request';
$myContent .= print_r($_POST, true);
$myContent .= print_r($_GET, true);
echo json_encode(array('error' => 'No server_request'));
}
file_put_contents($myFile, $myContent);
output in log.txt
Okay, ik heb het probleem gevonden.
PHP ziet de informatie niet als JSON. PHP heeft liefst dubbele quotes in de JSON string.
// Dit vindt PHP dus niet okay
"{'userName':'Jasper','password':'test'}"
// Dit wel
'{"userName":"Jasper","password":"test"}'
Kijk nog eens naar mij data string
(en vergeet mijn vorige advies. Dat was niet geschikt voor wat jij van plan was ...)
PHP ziet de informatie niet als JSON. PHP heeft liefst dubbele quotes in de JSON string.
// Dit vindt PHP dus niet okay
"{'userName':'Jasper','password':'test'}"
// Dit wel
'{"userName":"Jasper","password":"test"}'
Kijk nog eens naar mij data string
(en vergeet mijn vorige advies. Dat was niet geschikt voor wat jij van plan was ...)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept');
header('content-type: application/json; charset=utf-8');
date_default_timezone_set('Europe/Brussels');
$myFile = 'log.txt';
$myContent = file_get_contents($myFile);
$myContent .= "\n" . date('G:i:s') . "\n";
$myContent .= print_r(json_decode($_POST['test']) , true);
file_put_contents($myFile, $myContent);
echo json_encode($_POST['test']); // $_POST .''.
exit;
}
?>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>
$(document).ready(function() {
$('#klik').click(function() {
var url = 'index.php'
$.ajax({
url: url,
type: "post",
dataType: 'json',
data: {test: '{"userName":"Jasper","password":"test"}'},
error: function (f, e, d) {
console.warn("ERROR: " + e, f, d);
},
success: serviceCallback
});
});
function serviceCallback(response) {
$('#messages').html(response);
}
});
</script>
<input type="button" value="klik" id="klik">
<div id="messages"></div>
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept');
header('content-type: application/json; charset=utf-8');
date_default_timezone_set('Europe/Brussels');
$myFile = 'log.txt';
$myContent = file_get_contents($myFile);
$myContent .= "\n" . date('G:i:s') . "\n";
$myContent .= print_r(json_decode($_POST['test']) , true);
file_put_contents($myFile, $myContent);
echo json_encode($_POST['test']); // $_POST .''.
exit;
}
?>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>
$(document).ready(function() {
$('#klik').click(function() {
var url = 'index.php'
$.ajax({
url: url,
type: "post",
dataType: 'json',
data: {test: '{"userName":"Jasper","password":"test"}'},
error: function (f, e, d) {
console.warn("ERROR: " + e, f, d);
},
success: serviceCallback
});
});
function serviceCallback(response) {
$('#messages').html(response);
}
});
</script>
<input type="button" value="klik" id="klik">
<div id="messages"></div>
Gewijzigd op 23/12/2013 15:53:06 door Kris Peeters
In ajax de date op deze manier opgeven werkt ook niet:
json_decode($_POST['test']) geeft niets
$_POST geeft array()
$_POST['test'] geeft niets
JSON hard coded in de API zetten:
geeft in de log
json_decode($_POST['test']) geeft niets
$_POST geeft array()
$_POST['test'] geeft niets
JSON hard coded in de API zetten:
geeft in de log
Gewijzigd op 23/12/2013 15:58:57 door Jasper DS
Ik krijg nu wel het resultaat dat ik verwacht.
Mijn scherm zegt dit (dus de Ajax respons):
{"userName":"Jasper","password":"test"}
De log zegt:
15:54:59
stdClass Object
(
[userName] => Jasper
[password] => test
)
Doe jij nog iets substantieel anders dan ik?
Mijn scherm zegt dit (dus de Ajax respons):
{"userName":"Jasper","password":"test"}
De log zegt:
15:54:59
stdClass Object
(
[userName] => Jasper
[password] => test
)
Doe jij nog iets substantieel anders dan ik?
Kijk eens in je browser wat er daadwerkelijk verstuurd wordt. Want zo te zien zit je probleem aan de client kant, niet aan de server kant.
output in console:
XHR finished loading: "http://localhost/project/aanwezigheden/api/login.php".
hoe kan ik de post waarden traceren in chrome?
XHR finished loading: "http://localhost/project/aanwezigheden/api/login.php".
hoe kan ik de post waarden traceren in chrome?
Gewijzigd op 23/12/2013 16:22:10 door Jasper DS
Developer Tools => tab "Network"
Daar kan je elk verzoek traceren.
Elke image, elke .css, ... geeft een lijntje met informatie.
Naar het lijntje onderaan kijken, en op klikken.
Eerst Developer Tools openen, dan de pagina verversen
Daar kan je elk verzoek traceren.
Elke image, elke .css, ... geeft een lijntje met informatie.
Naar het lijntje onderaan kijken, en op klikken.
Eerst Developer Tools openen, dan de pagina verversen
Chrome werk ik zelf niet mee, dus precies zeggen kan ik het niet, maar waarschijnlijk via de developers tools. De meeste brwosers hebben wel een window waarin je kan zien welke data er verstuurd is, met welke headers etc.

Gewijzigd op 23/12/2013 16:36:58 door Jasper DS
Jasper DS op 23/12/2013 15:53:16:
In ajax de date op deze manier opgeven werkt ook niet:
json_decode($_POST['test']) geeft niets
$_POST geeft array()
$_POST['test'] geeft niets
JSON hard coded in de API zetten:
geeft in de log
json_decode($_POST['test']) geeft niets
$_POST geeft array()
$_POST['test'] geeft niets
JSON hard coded in de API zetten:
geeft in de log
data: { test: '{"userName": "Jasper", "password": "test"}'},
Die test moet ook tussen dubbele quotes.
@Kris volgens mij was het zo dat JSON vind dat er dubbele quotes gebruikt moeten worden en houdt PHP zich daar gewoon aan.
@LEDfan nee, die test is de key van de POST parameter en hoeft niet tussen quotes.
Omdat je de contentType verandert, zal PHP niet weten wat hij aanmoet met deze contentType. Als het goed is is de data wel zichtbaar op deze manier:
Haal de contentType dus weg als je het in $_POST wil hebben.
Haal de contentType dus weg als je het in $_POST wil hebben.
Erwin H op 23/12/2013 16:49:17:
@LEDfan nee, die test is de key van de POST parameter en hoeft niet tussen quotes.
Toch lijkt het me beter om het wel te doen, nu hoop je maar dat JQuery het (test) als een string beschouwt en niet als een variabele
Koen Vlaswinkel op 23/12/2013 18:17:50:
Omdat je de contentType verandert, zal PHP niet weten wat hij aanmoet met deze contentType. Als het goed is is de data wel zichtbaar op deze manier:
Haal de contentType dus weg als je het in $_POST wil hebben.
Haal de contentType dus weg als je het in $_POST wil hebben.
Dit had ik ook al een keer geprobeerd, maar het blijkt te werken als ik het formulier met enter verzend (button nog niet) dus ik ga hier mee verder. Bedankt!
Om even terug te komen op mijn afbeelding. Is het normaal dat er twee requesten gestuurd worden? 1x met de parameters en 1x zonder?




