Toon posts:

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

Pagina: 1
Acties:

Vraag


  • DeerDitch
  • Registratie: Mei 2010
  • Laatst online: 27-01 12:18
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: 23:08

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: 22:08

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: 27-01 12:18
Waarom zou ik '<' wel moeten escapen, maar een '/' niet?

f251a3362191f14872ff368789dd3c1a220782a1c582fbb31fec609763dd2cef


  • momania
  • Registratie: Mei 2000
  • Laatst online: 23:08

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*


  • Room42
  • 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 Room42 op 27-09-2018 17:58]

Blokkeert alle ads en trackers met:
- uBlock Origin
- uMatrix
- en Pi-Hole voor de rest van het netwerk.


  • DeerDitch
  • Registratie: Mei 2010
  • Laatst online: 27-01 12:18
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: 27-01 12:18
Room42 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: 23:08

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: 31-01 14:48
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: 27-01 12:18
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: 15:30
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


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee