Json parameters van ajax naar PHP
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
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>
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
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
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
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
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.
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
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.
![Afbeelding Afbeelding](http://i41.tinypic.com/1fz4hd.png)
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.
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?