Json parameters van ajax naar PHP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jasper DS

Jasper DS

23/12/2013 14:07:58
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
        });


api op domein z:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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));


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

PHP hulp

22/01/2020 06:32:02
 
Kris Peeters

Kris Peeters

23/12/2013 14:44:26
Quote Anchor link
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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>
 
Jasper DS

Jasper DS

23/12/2013 14:50:14
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
No 'Access-Control-Allow-Origin' header is present on the requested resource.


Edit:

Als ik gewoon $_POST log in mijn log file krijg ik
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
14:52:33
Array
(
)


en dat moet dus geen lege array zijn!
Gewijzigd op 23/12/2013 14:53:34 door Jasper DS
 
Kris Peeters

Kris Peeters

23/12/2013 15:00:46
Quote Anchor link
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
 
Jasper DS

Jasper DS

23/12/2013 15:08:18
Quote Anchor link
Array blijft leeg maar $_POST bestaat wel

ajax
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
        });


api
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);


output in log.txt
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
15:06:04
Array
(
)
 
Kris Peeters

Kris Peeters

23/12/2013 15:32:12
Quote Anchor link
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 ...)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>
Gewijzigd op 23/12/2013 15:53:06 door Kris Peeters
 
Jasper DS

Jasper DS

23/12/2013 15:53:16
Quote Anchor link
In ajax de date op deze manier opgeven werkt ook niet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$_POST['test'] = '{"userName": "Jasper", "password", "test"}';


geeft in de log
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
15:57:49
"{\"userName\": \"Jasper\", \"password\", \"test\"}"
Gewijzigd op 23/12/2013 15:58:57 door Jasper DS
 
Kris Peeters

Kris Peeters

23/12/2013 16:00:13
Quote Anchor link
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?
 
Erwin H

Erwin H

23/12/2013 16:00:19
Quote Anchor link
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.
 
Jasper DS

Jasper DS

23/12/2013 16:17:32
Quote Anchor link
output in console:
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
 
Kris Peeters

Kris Peeters

23/12/2013 16:26:44
Quote Anchor link
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
 
Erwin H

Erwin H

23/12/2013 16:26:59
Quote Anchor link
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.
 
Jasper DS

Jasper DS

23/12/2013 16:35:58
Quote Anchor link
http://i41.tinypic.com/1fz4hd.png
Gewijzigd op 23/12/2013 16:36:58 door Jasper DS
 
LEDfan nvt

LEDfan nvt

23/12/2013 16:45:57
Quote Anchor link
Jasper DS op 23/12/2013 15:53:16:
In ajax de date op deze manier opgeven werkt ook niet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$_POST['test'] = '{"userName": "Jasper", "password", "test"}';


geeft in de log
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
15:57:49
"{\"userName\": \"Jasper\", \"password\", \"test\"}"


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.
 
Erwin H

Erwin H

23/12/2013 16:49:17
Quote Anchor link
@LEDfan nee, die test is de key van de POST parameter en hoeft niet tussen quotes.
 
Koen Vlaswinkel

Koen Vlaswinkel

23/12/2013 18:17:50
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
file_get_contents('php://input');
?>

Haal de contentType dus weg als je het in $_POST wil hebben.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

23/12/2013 20:16:53
Quote Anchor link
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
 
Jasper DS

Jasper DS

24/12/2013 11:04:16
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
file_get_contents('php://input');
?>

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!
 
Jasper DS

Jasper DS

28/12/2013 22:15:07
Quote Anchor link
Jasper DS op 23/12/2013 16:35:58:
http://i41.tinypic.com/1fz4hd.png


Om even terug te komen op mijn afbeelding. Is het normaal dat er twee requesten gestuurd worden? 1x met de parameters en 1x zonder?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.