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:

	$.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
        });


api op domein z:

<?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));

[/code]

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?
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


<?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>

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:
No 'Access-Control-Allow-Origin' header is present on the requested resource.


[edit]
Als ik gewoon $_POST log in mijn log file krijg ik
14:52:33
Array
(
)


en dat moet dus geen lege array zijn!
[/edit]
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.
Array blijft leeg maar $_POST bestaat wel

ajax

$.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
        });


api
<?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);
[/code]

output in log.txt

15:06:04
Array
(
)

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
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>

In ajax de date op deze manier opgeven werkt ook niet:

data: { test: '{"userName": "Jasper", "password": "test"}'},


json_decode($_POST['test']) geeft niets
$_POST geeft array()
$_POST['test'] geeft niets

JSON hard coded in de API zetten:

$_POST['test'] = '{"userName": "Jasper", "password", "test"}';


geeft in de log

15:57:49
"{\"userName\": \"Jasper\", \"password\", \"test\"}"
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?
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?
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

Reageren