Cookies op Tweakers

Tweakers is onderdeel van DPG Media en maakt gebruik van cookies, JavaScript en vergelijkbare technologie om je onder andere een optimale gebruikerservaring te bieden. Ook kan Tweakers hierdoor het gedrag van bezoekers vastleggen en analyseren. Door gebruik te maken van deze website, of door op 'Cookies accepteren' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt? Bekijk dan ons cookiebeleid.

Meer informatie
Toon posts:

Ajax POST met JSON string werkt niet met '<' of '>'

Pagina: 1
Acties:

Vraag


  • DeerDitch
  • Registratie: mei 2010
  • Laatst online: 07-06 15:51
Hi,

Ik probeer wat data vanuit een webpagina met JSON naar PHP te zenden. Niet echt moeilijk natuurlijk, maar ik loop wel tegen een raar probleem aan. Zodra er een '>' of een '<' in de JSON string voorkomt, krijg ik een json_decode error in PHP. Wat is de reden dat deze tekens (blijkbaar) niet gepost kunnen worden?

De bedoeling van JSON.stringify(data), is toch dat alles wordt omgezet naar een string?

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
      var ajaxpost = "x=" + JSON.stringify(myObj);
      $("#responsediv").html(ajaxpost);

      $.ajax({
        url: '/Administration/PHP/saveMigrationData.php',
        type: 'POST',
        data: ajaxpost,
        async: true,
        dataType: 'html',
        contentType: "application/x-www-form-urlencoded; charset=UTF-8",
        success: function (response) {
          $("#responsediv").append(response);
        }
      })

Dit is de JSON string die wordt getoond in "#responsediv":

x={"591":{"oos_nr":"591","analyst_id":"2","method_id":"101","batch_number":"0811002455","stability":"False","product_id":"18","parameter":"","specification":"< 3.9 ppm Fe","result":"65.2 ppm","comments":"Heranalyse op ** apparatuur geeft zelfde resultaat als heranalyse van **","date":"4/20/2009","closed":"ja","analyst_error":"","miscellaneous_error":"","analysis_error":"ja","product_error":""}

Maar de response vanuit PHP wordt afgekapt voor het '<'-teken??

PHP:
1
var_dump($_POST['x']);

"{"591":{"oos_nr":"591","analyst_id":"2","method_id":"101","batch_number":"0811002455","stability":"False","product_id":"18","parameter":"","specification":""

PHP:
1
2
$obj = json_decode($_POST['x']);
var_dump($obj);

NULL

PHP:
1
echo "<br>json error code = " . json_last_error();

json error code = 3


Het veranderen van de contentType heeft ook geen invloed. Als ik daadwerkelijk dat '<' - teken weghaal dan werkt het wel!
PHP versie = 7.0

Iemand een idee?

f251a3362191f14872ff368789dd3c1a220782a1c582fbb31fec609763dd2cef

Beste antwoord (via DeerDitch op 28-09-2018 10:05)


  • momania
  • Registratie: mei 2000
  • Laatst online: 19-06 14:37

momania

iPhone 30! Bam!

DeerDitch schreef op donderdag 27 september 2018 @ 18:37:
[...]


Ik post eigenlijk toch gewoon een key=value naar PHP?
Als ik dan echo $_POST['x'] doe, dan moet ik toch de complete value zien en niet tot een bepaald punt?
Je zet application/x-www-form-urlencoded, dan moet je ook wel je content url encoden.
Als je niet weet wat dat is, heb je wat op te zoeken. ;)

OF, je post application/json, in de body, dus:
code:
1
2
3
4
5
...
data: JSON.stringify(myObj),
contentType: "application/json; charset=UTF-8",

...

(dataType kan je weglaten)

Aan de php kant moet je dan natuurlijk ook de body direct parsen als json, en niet 'x'.

Neem je whisky mee, is het te weinig... *zucht*

Alle reacties


  • The Eagle
  • Registratie: januari 2002
  • Laatst online: 19-06 17:36

The Eagle

I wear my sunglasses at night

Al eens geprobeerd om de boel te escapen? :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


  • DeerDitch
  • Registratie: mei 2010
  • Laatst online: 07-06 15:51
Waarom zou ik '<' wel moeten escapen, maar een '/' niet?

f251a3362191f14872ff368789dd3c1a220782a1c582fbb31fec609763dd2cef


  • momania
  • Registratie: mei 2000
  • Laatst online: 19-06 14:37

momania

iPhone 30! Bam!

Je wil json posten, maar doet dan dit:
code:
1
2
dataType: 'html',
contentType: "application/x-www-form-urlencoded; charset=UTF-8",


Je wil je json dus als string posten, dan moet alles url encoded zijn.

Normaal gesproken post je json gewoon in de body, en is je content typ application/json.
Snap niet waarom je het nu als form wilt doen?

Neem je whisky mee, is het te weinig... *zucht*


  • u34186
  • Registratie: september 2001
  • Niet online
DeerDitch schreef op donderdag 27 september 2018 @ 17:21:
x={"591":{"oos_nr":"591","analyst_id":"2","method_id":"101","batch_number":"0811002455","stability":"False","product_id":"18","parameter":"","specification":"< 3.9 ppm Fe","result":"65.2 ppm","comments":"Heranalyse op ** apparatuur geeft zelfde resultaat als heranalyse van **","date":"4/20/2009","closed":"ja","analyst_error":"","miscellaneous_error":"","analysis_error":"ja","product_error":""}
Als dit gewoon een voorbeeld is, dan kan ik de typo begrijpen, maar zoals hier gepost is deze JSON niet valide, je mist een } aan het eind.
Maar de response vanuit PHP wordt afgekapt voor het '<'-teken??

PHP:
1
var_dump($_POST['x']);

"{"591":{"oos_nr":"591","analyst_id":"2","method_id":"101","batch_number":"0811002455","stability":"False","product_id":"18","parameter":"","specification":""
Is dit gezien op de webpagina zelf, of kijk je wel degelijk in de HTML source (view source) in de browser?

Mijn eerste opmerking kan namelijk ook de foutmelding zijn die je krijgt, terwijl jij je laat afleiden door de HTML-weergave van de var_dump ;)

[Voor 6% gewijzigd door u34186 op 27-09-2018 17:58]

Block ads en trackers: uBlock Origin, uMatrix, Pi-Hole
YouTube: SponsorBlock en YoutubeVanced


  • DeerDitch
  • Registratie: mei 2010
  • Laatst online: 07-06 15:51
momania schreef op donderdag 27 september 2018 @ 17:55:
Je wil json posten, maar doet dan dit:
code:
1
2
dataType: 'html',
contentType: "application/x-www-form-urlencoded; charset=UTF-8",


Je wil je json dus als string posten, dan moet alles url encoded zijn.

Normaal gesproken post je json gewoon in de body, en is je content typ application/json.
Snap niet waarom je het nu als form wilt doen?
Heb ook content type application/json geprobeerd, maar dat lukt ook niet. text/plain werkt ook niet.
Ook geprobeerd met processData: false, geen succes.

Ik post eigenlijk toch gewoon een key=value naar PHP?
Als ik dan echo $_POST['x'] doe, dan moet ik toch de complete value zien en niet tot een bepaald punt?

f251a3362191f14872ff368789dd3c1a220782a1c582fbb31fec609763dd2cef


  • DeerDitch
  • Registratie: mei 2010
  • Laatst online: 07-06 15:51
Evanescent schreef op donderdag 27 september 2018 @ 17:57:
[...]
Als dit gewoon een voorbeeld is, dan kan ik de typo begrijpen, maar zoals hier gepost is deze JSON niet valide, je mist een } aan het eind.
Klopt, is een typo
[...]

Is dit gezien op de webpagina zelf, of kijk je wel degelijk in de HTML source (view source) in de browser?

Mijn eerste opmerking kan namelijk ook de foutmelding zijn die je krijgt, terwijl jij je laat afleiden door de HTML-weergave van de var_dump ;)
Is inderdaad op de pagina zelf. De source heb ik niet bekeken. Misschien levert dat nog wat info op

edit:
sorry voor de dubbele post, ben met de telefoon aan het antwoorden en das een beetje wennen

[Voor 7% gewijzigd door DeerDitch op 27-09-2018 18:42]

f251a3362191f14872ff368789dd3c1a220782a1c582fbb31fec609763dd2cef


Acties:
  • Beste antwoord
  • +1Henk 'm!

  • momania
  • Registratie: mei 2000
  • Laatst online: 19-06 14:37

momania

iPhone 30! Bam!

DeerDitch schreef op donderdag 27 september 2018 @ 18:37:
[...]


Ik post eigenlijk toch gewoon een key=value naar PHP?
Als ik dan echo $_POST['x'] doe, dan moet ik toch de complete value zien en niet tot een bepaald punt?
Je zet application/x-www-form-urlencoded, dan moet je ook wel je content url encoden.
Als je niet weet wat dat is, heb je wat op te zoeken. ;)

OF, je post application/json, in de body, dus:
code:
1
2
3
4
5
...
data: JSON.stringify(myObj),
contentType: "application/json; charset=UTF-8",

...

(dataType kan je weglaten)

Aan de php kant moet je dan natuurlijk ook de body direct parsen als json, en niet 'x'.

Neem je whisky mee, is het te weinig... *zucht*


  • frickY
  • Registratie: juli 2001
  • Laatst online: 00:04
De 'var_dump' toont gewoon alles, maar je browser laat na de '<' niets zien want behandeld het als een HTML tag.

Kijk naar de bron van de pagina, of stuur deze als 'text/plain'.

Om Json te posten heb je geen form enctype nodig, maar het kan inderdaad wel. Iets voor later.

  • DeerDitch
  • Registratie: mei 2010
  • Laatst online: 07-06 15:51
momania schreef op donderdag 27 september 2018 @ 18:58:
[...]

Je zet application/x-www-form-urlencoded, dan moet je ook wel je content url encoden.
Als je niet weet wat dat is, heb je wat op te zoeken. ;)

OF, je post application/json, in de body, dus:
...
(dataType kan je weglaten)

Aan de php kant moet je dan natuurlijk ook de body direct parsen als json, en niet 'x'.
Thanks @momania
Beide opties heb ik geprobeerd en allebei werkt perfect.
Omdat ik naast myObj nog wat formdata naar PHP moet sturen, zal ik de urlencode content type gebruiken.

Eerst maak ik de variable die de encoded content bevat en zet die in een variabele met de formdata:
JavaScript:
1
2
var jsonstring = encodeURIComponent(JSON.stringify(myObj));
var ajaxpost = "x=" + jsonstring + "&" + formdata;

En daarna:
code:
1
2
3
4
...
data: ajaxpost,
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
...

f251a3362191f14872ff368789dd3c1a220782a1c582fbb31fec609763dd2cef


  • boe2
  • Registratie: november 2002
  • Niet online

boe2

'-')/

afaik is zelfs json.stringify niet meer nodig als je datatype op application/json zet :)

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


  • ThomasG
  • Registratie: juni 2006
  • Laatst online: 00:10
boe2 schreef op vrijdag 28 september 2018 @ 12:22:
afaik is zelfs json.stringify niet meer nodig als je datatype op application/json zet :)
Ja, maar dat kan in dit geval dus niet. Je kunt alleen content-type application/json gebruiken als de payload van de request enkel JSON is. In dit geval is het een request waarbij de json slechts een onderdeel is van een grotere payload; en is de gehele payload dus geen application/json.
Pagina: 1


Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Microsoft Xbox Series X LG CX Google Pixel 5a 5G Sony XH90 / XH92 Samsung Galaxy S21 5G Sony PlayStation 5 Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True