KnooppuntJS. Gegevens verzenden in JSON-indeling. Verzend JSON-gegevens van Javascript naar PHP

JSON (JavaScript Object Notation) is een formaat voor het uitwisselen van gegevens in tekstvorm. Maakt de overdracht van complexe datastructuren in geserialiseerde vorm mogelijk. Dit formaat voor gegevensoverdracht is zo populair geworden dat al in de PHP-kern, vanaf versie 5.2.0, functies voor het verwerken van gegevens in dit formaat zijn toegevoegd. Dit betekent dat er geen verbinding nodig is extra uitbreidingen. Het JSON-gegevensformaat is zeer leesbaar voor mensen. Daarnaast dit type gegevensuitwisseling wordt veel gebruikt tussen verschillende API-diensten. En met de juiste ontwikkeling van algoritmen voor informatie-uitwisseling kun je een zeer hoge snelheidswinst behalen dan bijvoorbeeld bij het werken met gegevens in XML-formaat.

Gegevens verzenden

Gegevens verzenden naar JSON-formaat kan op twee manieren worden gedaan: vorm een ​​GET of POST-verzoek met gecodeerde gegevens in GET of POST-variabele of plaats de gegevens in de hoofdtekst van het document. In de praktijk wordt meestal de tweede optie gebruikt.

Om gegevens te verzenden zijn de volgende functies vereist:

  • tekenreeks json_encode (gemengde waarde [, int opties = 0 ])

    De waardeparameter specificeert de gegevens die moeten worden gecodeerd. Elk type wordt ondersteund, behalve type bron. De optieparameter bevat een bitmasker van de mogelijk opgegeven waarden (zie tabel met door JSON geleverde constanten).

  • bron stream_context_create (])

    Deze functie is ontworpen om een ​​threadcontext te maken en terug te geven met de opties die zijn opgegeven in de optieparameter. De optionele parameter Options moet van het type associatieve array zijn. Aanvankelijk is het leeg. De tweede optionele params-parameter moet ook een associatieve array zijn in de notatie $data['name'] = waarde.

  • string file_get_contents (string bestandsnaam [, bool use_include_path [, broncontext [, int offset [, int maxlen ]]]])

    Met deze functie kunt u de inhoud van een bestand als tekenreeks ophalen. De bestandsnaamparameter is de naam van het bestand dat moet worden gelezen. In de parameter use_include_path beginnend bij PHP-versies 5 Je kunt een constante gebruiken FILE_USE_INCLUDE_PATH om naar een bestand in het include-pad te zoeken. De contextparameter vertegenwoordigt de contextbron die is gemaakt met de functie stream_context_create(). Als de poging om het bestand te openen mislukt, wordt de waarde geretourneerd vals. De offsetparameter bevat de offset vanaf waar het lezen van gegevens zal beginnen. De maxlen-parameter specificeert de grootte van de ontvangen gegevens.

    Let op: de offset wordt niet gespecificeerd bij het werken met externe threads.

Hieronder ziet u een voorbeeld van het verzenden van gegevens in JSON-indeling:

// Te verzenden gegevens $request = array("StartDate" => "2013-10-10", "EndDate" => "2013-10-10", "IDS" => array(1,2,3,4 ,5,6,7)); // Opties opgeven voor de streamcontext $options = array ("http" => array ("method" => "POST", "header" => "Content-Type: application/json; charset=utf-8\r \ n", "content" => json_encode($request))); // Maak een streamcontext $context = stream_context_create($options); // Gegevens verzenden en het resultaat ophalen echo file_get_contents("http://test.ru/json.php", 0, $context);

Hier wordt een geïmproviseerde datastructuur gebruikt, bestaande uit een begin- en einddatum, evenals een reeks cijfers van sommige voorwaardelijke inschrijvingen. Houd er rekening mee dat dit in de verzoekheader staat Inhoudstype het type “application/json” is gespecificeerd.

Gegevens ontvangen

Om de verzonden gegevens te ontvangen op de manier zoals hierboven beschreven je moet gegevens uit de invoerstroom lezen “ php://invoer”.

Functies die worden gebruikt om gegevens te accepteren:

  • gemengde json_decode (string json [, bool assoc = false [, int depth = 512 [, int opties = 0 ]]])

    Deze functie decodeert een tekenreeks in JSON-indeling. De json-parameter specificeert de tekenreeks die moet worden gedecodeerd. De parameter assoc bepaalt of de geretourneerde gegevens worden geconverteerd naar associatieve array. Als er een dergelijke behoefte bestaat, moet u de waarde van deze parameter opgeven WAAR. De diepteparameter geeft de recursiediepte aan. En de laatste vierde parameter, opties, bevat een bitmasker met opties voor decodering. Momenteel alleen ondersteund JSON_BIGINT_AS_STRING(standaard worden grote gehele getallen geconverteerd naar getallen met drijvende komma (float))

  • resource fopen (string bestandsnaam, stringmodus [, bool use_include_path [, resourcecontext ]])

    Opent een bestand en retourneert de handle ervan. De parameter bestandsnaam is een benoemde bron die naar een bestand verwijst. De parameter mode specificeert het type toegang tot het bestand (zie tabel met een lijst mogelijke modi voor fopen()). Hierna volgen twee optionele parameters: use_include_path en context . Wanneer u use_include_path instelt op WAAR of 1 en op voorwaarde dat de genoemde bron is ingesteld op relatief pad, wordt het te openen bestand doorzocht in de lijst met mappen die door de functies worden gebruikt erbij betrekken En vereisen. In de praktijk wordt deze parameter praktisch niet gebruikt. De contextparameter wordt gebruikt om de context van de bron op te geven.

  • string stream_get_contents (bronhandle [, int maxlen = -1 [, int offset = -1 ]])

    Met deze functie kunt u de inhoud van een stream als string ophalen. De parameter handle is een threadbron. De maxlen-parameter bevat maximale hoeveelheid byte om te lezen. Standaard is deze ingesteld op -1, wat aangeeft dat alle gegevens zijn ontvangen. De offsetparameter bevat de offset vanaf waar het lezen van gegevens zal beginnen. Standaard staat deze ook op -1, wat betekent dat er vanaf de startpositie wordt gelezen.

Hieronder ziet u een voorbeeld van het ontvangen van gegevens in JSON-indeling aan de serverzijde:

// Open de invoerstroom voor het lezen van $f = fopen("php://input", "r"); // Haal de inhoud van de stream op $data = stream_get_contents($f); if ($data) ( // Verwerkingscode print_r(json_decode($data)); )

De resulterende datastructuur:

StdClass-object ( => 10-10-2013 => 10-10-2013 => Array ( => 1 => 2 => 3 => 4 => 5 => 6 => 7))

Let op: het is noodzakelijk om er rekening mee te houden dat om met het JSON-formaat te werken, de gegevens gecodeerd moeten zijn in utf-8.

JSON leverde constanten voor de functie json_encode().

JSON_HEX_TAG (geheel getal) Ze zijn allemaal gecodeerd in \u003C en \u003E. Beschikbaar sinds PHP 5.3.0.
JSON_HEX_AMP (geheel getal) Alle & zijn gecodeerd in &. Beschikbaar sinds PHP 5.3.0.
JSON_HEX_APOS (geheel getal) Alle '-tekens zijn gecodeerd in \u0027. Beschikbaar sinds PHP 5.3.0.
JSON_HEX_QUOT (geheel getal) Alle "-tekens zijn gecodeerd in \u0022. Beschikbaar sinds PHP 5.3.0.
JSON_FORCE_OBJECT (geheel getal) Retourneert een object in plaats van een array als u een niet-associatieve array gebruikt. Dit is handig als het ontvangende programma of de ontvangende code een object verwacht of als de array leeg is. Beschikbaar sinds PHP 5.3.0.
JSON_NUMERIC_CHECK (geheel getal) Tekenreeksen coderen die getallen bevatten als getallen. Beschikbaar sinds PHP 5.3.3.
JSON_BIGINT_AS_STRING (geheel getal) Codeert grote gehele getallen als hun tekenreeksequivalenten. Beschikbaar sinds PHP 5.4.0.
JSON_PRETTY_PRINT (geheel getal) Gebruik witruimte tekens in de geretourneerde gegevens om deze te formatteren. Beschikbaar sinds PHP 5.4.0.
JSON_UNESCAPED_SLASHES (geheel getal) Ontsnap niet /. Beschikbaar sinds PHP 5.4.0.
JSON_UNESCAPED_UNICODE (geheel getal) Codeer geen multibytes Unicode-tekens(standaard worden ze gecodeerd als \uXXXX). Beschikbaar sinds PHP 5.4.0.

Lijst met mogelijke modi voor fopen() die modus gebruiken

'R' Opent het bestand alleen-lezen; plaatst de aanwijzer aan het begin van het bestand.
'r+' Opent een bestand voor lezen en schrijven; plaatst de aanwijzer aan het begin van het bestand.
'w' Opent het bestand alleen om te schrijven; plaatst een pointer aan het begin van het bestand en kapt het bestand af tot een lengte van nul. Als het bestand niet bestaat, probeert het het te maken.
'w+' Opent een bestand voor lezen en schrijven; plaatst een pointer aan het begin van het bestand en kapt het bestand af tot een lengte van nul. Als het bestand niet bestaat, probeert het het te maken.
'A' Opent het bestand alleen om te schrijven; plaatst de aanwijzer aan het einde van het bestand. Als het bestand niet bestaat, probeert het het te maken.
'een+' Opent een bestand voor lezen en schrijven; plaatst de aanwijzer aan het einde van het bestand. Als het bestand niet bestaat, probeert het het te maken.
'X' Creëert en opent alleen om te schrijven; plaatst de aanwijzer aan het begin van het bestand. Als het bestand al bestaat, mislukt de fopen()-aanroep, retourneert FALSE en genereert een E_WARNING-fout. Als het bestand niet bestaat, zal het proberen het te maken. Dit komt overeen met het opgeven van de O_EXCL|O_CREAT-vlaggen voor het interne systeem oproep geopend(2).
'x+' Creëert en opent voor lezen en schrijven; anders heeft hetzelfde gedrag als 'x'.
'C' Opent het bestand alleen om te schrijven. Als het bestand niet bestaat, wordt het gemaakt. Als het bestand bestaat, wordt het niet afgekapt (in tegenstelling tot 'w'), en het aanroepen van deze functie veroorzaakt geen fout (zoals in het geval van 'x'). De bestandsaanwijzer wordt naar het begin van het bestand geplaatst. Dit kan handig zijn als u het bestand wilt vergrendelen (zie kudde()) voordat u het wijzigt, omdat het gebruik van 'w' het bestand kan afkappen voordat de vergrendeling is verkregen (als u het bestand wilt afkappen, kunt u de ftruncate () functie na het aanvragen van het slot).
'c+' Opent een bestand voor lezen en schrijven; anders heeft hetzelfde gedrag als 'c'.

Hallo allemaal! In dit artikel zullen we bekijken hoe u gegevens in JSON-formaat in NodeJS naar de klant kunt verzenden.

Invoering

In het laatste artikel hebben we gekeken hoe je HTML-pagina's naar de client kunt sturen met behulp van streams in NodeJS. Vandaag zullen we kijken hoe we gegevens in JSON-formaat kunnen verzenden.

We gebruiken geen threads om dit probleem op te lossen, dus u kunt alle threadgerelateerde code verwijderen. In plaats daarvan zullen we de methode end() gebruiken, die ons al bekend is en die in een van de vorige artikelen werd gebruikt.

Hoe JSON te verzenden

Allereerst moeten we de header wijzigen zodat de browser onze gegevens correct kan verwerken:

Res.writeHead(200, ("Content-Type": "applicatie/json"));

Laten we nu het object maken dat we naar de client willen sturen:

Var mijnObj = (
naam: "Jan",
baan: "programmeur",
leeftijd: 27
};

Laten we nu de gegevens naar de client sturen:

Res.end(mijnObj);

Maar in werkelijkheid zal een dergelijke code niet correct werken. Het punt is dat de end()-methode gegevens in stringformaat of een buffer verwacht. We hebben een object, maar we kunnen er als volgt een string van maken:

Res.end(JSON.stringify(mijnObj));

Als u nu de applicatie uitvoert, ziet u dat de gegevens als tekenreeks in JSON-indeling zijn geleverd. U kunt ook de ontwikkelaarstools in uw browser gebruiken en zien dat de header ook correct is ingesteld.

Waarom JSON-gegevens naar de client sturen?

U vraagt ​​zich misschien af ​​waarom u überhaupt gegevens in JSON-indeling naar de klant moet verzenden. Om deze vraag te beantwoorden, stel je voor dat je een javascript aan de clientzijde (frontend) hebt draaien en dat dit een soort verzoek kan creëren. Je hebt bijvoorbeeld een API. U kunt de volgende query schrijven:

Localhost:3000/api/verzoek

En de server zal ons voor dit verzoek gegevens moeten sturen. Het handigst is om ze in JSON-formaat te versturen, zodat een script dat aan de clientzijde draait deze gegevens vervolgens gemakkelijk kan verwerken.

Conclusie

Dus vandaag hebben we gekeken hoe we gegevens naar de klant kunnen verzenden in JSON-formaat in NodeJS.

JSON aan de serverzijde gebruiken om verzoeken te ontvangen en antwoorden te creëren

Inhoudsreeks: de echte waarde van JSON

In hebben we gesproken over hoe JSON handig is als gegevensformaat voor Ajax-applicaties, omdat je hiermee snel JavaScript-objecten naar stringwaarden kunt converteren en omgekeerd. Omdat Ajax-applicaties het meest geschikt zijn voor het verzenden en ontvangen van platte tekst, verdient het bijna altijd de voorkeur om een ​​API te gebruiken die deze kan genereren; Met JSON kun je naast deze functie ook met native werken JavaScript-objecten en hoeft u zich geen zorgen te maken over hoe deze objecten er in de tekst uit zullen zien.

Ajax-bronnencentrum op developerWorks
Bekijk uw centrale bron voor Ajax-programmering, met artikelen, tutorials, forums, blogs, wiki's, evenementen en nieuws. Als er iets gebeurt, is er informatie over.

XML heeft dezelfde voordelen van een tekstformaat als JSON, maar de API's voor het converteren van JavaScript-objecten naar XML (en die zijn er) zijn niet zo goed ontwikkeld vergeleken met software-interface JSON; Bij het maken en wijzigen van objecten moet u er soms voor zorgen dat de geselecteerde API normaal met deze objecten kan werken. JSON maakt de zaken eenvoudiger: het verwerkt vrijwel elk denkbaar type object en retourneert de gegevens eenvoudigweg in een mooie JSON-weergave.

De belangrijkste waarde van JSON is dus dat je met JavaScript kunt werken zoals met JavaScript, en niet zoals bij een taal voor gegevensopmaak. U kunt dus alle verworven vaardigheden bij het werken met JavaScript-objecten in uw code toepassen, zonder u zorgen te hoeven maken over hoe deze objecten in tekst worden omgezet. Je roept aan het einde gewoon een eenvoudige JSON-methode aan:

Tekenreeks myObjectInJSON = mijnObject.toJSONString();

en ontvang een sms die naar de server kan worden verzonden.

JSON leveren aan de server

Er is niets bijzonder ingewikkelds aan het verzenden van JSON-gegevens naar de server, maar het is een belangrijke overweging en u heeft een aantal opties waaruit u kunt kiezen. Als u echter voor JSON kiest, wordt het veel gemakkelijker om verdere beslissingen te nemen, omdat de keuze aanzienlijk wordt beperkt en u zich er niet al te veel zorgen over hoeft te maken. Uiteindelijk hoeft u alleen maar de JSON-string aan de server af te leveren, bij voorkeur zo snel en gemakkelijk mogelijk.

JSON verzenden in naam/waarde-paren met behulp van de GET-methode

De eenvoudigste manier om JSON-gegevens aan de server te leveren, is door deze naar tekst te converteren en deze als de waarde van een naam/waarde-paar te verzenden. Vergeet niet dat JSON-geformatteerde gegevens slechts één mooie zijn groot voorwerp, die er ongeveer zo uitziet als Lijst 1:

Lijst 1. Een eenvoudig JavaScript-object in JSON-formaat var people = ( "programmers": [ ( "firstName": "Brett", "lastName": McLaughlin", "email": " [e-mailadres beveiligd]" ), ( "voornaam": "Jason", "achternaam": "Hunter", "email": " [e-mailadres beveiligd]" ), ( "voornaam": "Elliotte", "achternaam": "Harold", "email": " [e-mailadres beveiligd]" ) ], "authors": [( "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" ), ( "firstName": "Tad", "lastName": " Williams", "genre": "fantasie" ), ( "voornaam": "Frank", "achternaam": "Peretti", "genre": "christelijke fictie") ], "muzikanten": [ ("voornaam": "Eric", "achternaam": "Clapton", "instrument": "gitaar" ), ( "voornaam": "Sergei", "achternaam": "Rachmaninoff", "instrument": "piano" ) ] )

Deze tekst kan dus als volgt naar het serverscript worden verzonden in een naam/waarde-paar:

var url = "organizePeople.php?people=" + people.toJSONString(); xmlHttp.open("GET", url, waar); xmlHttp.onreadystatechange = updatePagina; xmlHttp.send(null);

Alles lijkt hier in orde te zijn, maar in feite is er één probleem: onze JSON-gegevensreeks bevat spaties en andere tekens die de webbrowser kan proberen te interpreteren. Om te voorkomen dat deze tekens problemen op de server veroorzaken (en de gegevensoverdracht verstoren), moet u de JavaScript-functie escape() aan de code toevoegen. Zoals dit:

var url = "organizePeople.php?people=" + escape(people.toJSONString()); request.open("GET", url, waar); request.onreadystatechange = updatePage; verzoek.verzenden(null);

Deze functie verwerkt spaties, schuine strepen en al het andere dat de browser in verwarring kan brengen. Het zet ze in deze zin om in ‘veilige’ tekens (een spatie wordt bijvoorbeeld omgezet in de %20 escape-reeks, die browsers niet langer als een spatie waarnemen, maar eenvoudigweg ongewijzigd naar de server verzenden). Vervolgens wordt de server uitgevoerd omgekeerde conversie(meestal automatisch) en we krijgen de string zoals deze was vóór de overdracht.

Deze aanpak heeft twee nadelen:

  • Ten eerste verzenden we gegevens, die mogelijk zeer groot kunnen zijn, met behulp van een GET-verzoek dat een limiet heeft op de lengte van de URL-tekenreeks. De maximaal toegestane lijngrootte is erg groot, maar we weten nooit hoeveel lange snaar we krijgen na het converteren van het object naar tekst, vooral als dit object behoorlijk complex is.
  • Ten tweede versturen we data via het netwerk in duidelijke tekst– dat wil zeggen, de meest onveilige van alle denkbare methoden voor gegevensoverdracht.

Voor de duidelijkheid: beide tekortkomingen hebben meer te maken met de beperkingen van GET-verzoeken dan met de specifieke kenmerken van JSON. Als u echter meer dan alleen de achternaam of voornaam van de gebruiker of het resultaat van zijn keuze in een formulier op uw site naar de server verzendt, kunnen deze tekortkomingen uw leven vrijwel verpesten. Als u gaat werken met gegevens die op zijn minst enigszins vertrouwelijk kunnen zijn of groot formaat, moet je zeker aandacht besteden aan POST-verzoeken.

JSON-gegevens overbrengen met behulp van de POST-methode

Als u besluit om JSON-gegevens naar de server te verzenden POST-methode in plaats van GET dus grote veranderingen Je hoeft het niet aan de code toe te voegen. Hier is alles wat u moet doen:

var url = "organizePeople.php?timeStamp=" + nieuwe datum().getTime(); request.open("POST", url, waar); request.onreadystatechange = updatePage; request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); request.send(mensen.toJSONString());

Het grootste deel van deze code zou bekend moeten zijn uit het artikel : waarin het maken van POST-verzoeken werd besproken. Hier openen we het verzoek met behulp van POST in plaats van GET, en stellen we de juiste header "Content-Type" in om het verwachte type gegevens aan te geven in dit geval het zal er als volgt uitzien: application/x-www-form-urlencoded , waardoor het voor de server duidelijk wordt dat we alleen tekstgegevens doorgeven, die deze in principe van een gewoon HTML-formulier zou kunnen ontvangen.

Een andere kleine wijziging in de code is het toevoegen aan URL van de huidige tijd. Dit wordt gedaan om te voorkomen dat verzoeken in de cache worden opgeslagen en om ervoor te zorgen dat ze worden aangemaakt en verzonden telkens wanneer de methode wordt aangeroepen; URL-reeksen zal elke keer iets anders zijn vanwege de verandering in de tijdstempel. Dit is een veelgebruikte techniek om ervoor te zorgen dat het POST-verzoek daadwerkelijk elke keer opnieuw wordt gegenereerd en dat de webbrowser niet probeert de antwoorden van de server in de cache op te slaan.

JSON is slechts tekst

Bij met behulp van GET en POST-verzoeken is het erg belangrijk dat JSON tenslotte platte tekst. Het kan gemakkelijk worden gemanipuleerd en naar de server worden verzonden, omdat er geen speciale codering voor nodig is. Tekstgegevens kunnen door elk serverscript worden verwerkt. Als JSON een binair formaat of een slim gecodeerde tekst zou zijn, zouden de dingen niet zo eenvoudig zijn. JSON bestaat dus uit gewone tekstgegevens die een script mogelijk zou kunnen ontvangen bij het indienen van een HTML-formulier (zoals we zagen met de header "Content-Type" in POST-verzoeken), dus u hoeft zich er niet al te veel zorgen over te maken over het verzenden het naar de server.

JSON interpreteren op de server

Zodra u uw JavaScript-code aan de clientzijde heeft geschreven waarmee gebruikers kunnen communiceren met uw webpagina's en formulieren en de informatie ter verwerking kunnen indienen serverprogramma, de belangrijkste speler in uw applicatie (en waarschijnlijk in alles wat we "Ajax-applicaties" noemen, ervan uitgaande dat de aanroep naar het serverscript asynchroon gebeurt) is de server. En hier moet de keuze die u aan de clientzijde hebt gemaakt, waarbij u besluit JavaScript-objecten en JSON-gegevens te gebruiken, samenvallen met de overeenkomstige beslissing aan de serverzijde, waar de API voor het decoderen van JSON-gegevens wordt geselecteerd.

Twee fasen van het injecteren van JSON in de server

Werken met JSON aan de serverkant, ongeacht wat u gebruikt servertaal bestaat in essentie uit twee fases:

  • Een JSON-parser/toolkit/helper-API zoeken voor uw taal aan de serverzijde
  • Een JSON-parser/toolkit/helper-API gebruiken om gegevens uit het clientverzoek te extraheren en deze om te zetten in een vorm die het serverscript kan begrijpen
  • En dat is alles wat er is. Laten we beide fasen eens nader bekijken.

    Zoek naar een JSON-parser

    De beste bron voor het vinden van een JSON-parser en andere JSON-gerelateerde softwaretools is de JSON-website (zie links in ). Naast educatieve informatie over het formaat zelf, vind je op deze pagina links naar JSON-tools en JSON-parsers voor elk platform: van ASP tot Erlang, van Pike tot Ruby. Zoek daar gewoon de taal waarin uw script is geschreven en download de juiste toolkit. Kopieer het voor jezelf of update je servertaalversie ermee of installeer het gewoon (er zijn veel opties: het hangt allemaal af van wat je op de server gebruikt: C#, PHP, Lisp of iets anders), het belangrijkste is dat scripts of programma's hebt u mogelijk deze toolkit op uw server gebruikt.

    Als u bijvoorbeeld PHP gebruikt, kunt u deze eenvoudig updaten naar de recente versie 5.2, die standaard de JSON-extensie bevat. Dit is waarschijnlijk de gemakkelijkste manier om aan de slag te gaan met JSON als je PHP gebruikt. Als u Java-servlets gebruikt, is de eenvoudigste manier om het org.json-pakket van json.org te gebruiken. Om dit te doen, moet u het json.zip-archief downloaden van de JSON-website en de bestanden kopiëren van broncodes in de compilatiemap van uw project en compileer ze dienovereenkomstig - en u zult met JSON kunnen werken. Ongeveer hetzelfde moet worden gedaan bij het gebruik van andere talen; beste hulp Dit omvat uw eigen programmeerervaring voor het juiste serverplatform.

    Een JSON-parser gebruiken

    Nadat de benodigde tools zijn geïnstalleerd, hoeft u alleen nog maar te bellen gewenste methode. Laten we bijvoorbeeld zeggen dat we PHP en de JSON-PHP-module gebruiken:

    // Dit is slechts een fragment van een groot PHP-script op de server require_once("JSON.php"); $json = nieuwe Services_JSON(); // accepteer POST-gegevens en decodeer deze $value = $json->decode($GLOBALS["HTTP_RAW_POST_DATA"]); // nu werken we met de variabele $value zoals met gewone “rauwe” PHP-gegevens

    Met behulp van deze code plaatsen we alle gegevens (arrays, meerdere strings, enkele waarden - alles wat zich in de JSON-datastructuur bevond) in de $value-variabele en in het oorspronkelijke PHP-formaat.

    Als we Java-servlets en het org.json-pakket op de server zouden gebruiken, zou de code er ongeveer zo uitzien:

    public void doPost(HttpServletRequest request, HttpServletResponse response) genereert ServletException, IOException ( StringBuffer jb = new StringBuffer(); String line = null; try ( BufferedReader reader = request.getReader(); while ((line = reader.readLine()) != null) jb.append(line); ) catch (Uitzondering e) ( //foutmelding) try ( JSONObject jsonObject = new JSONObject(jb.toString()); ) catch (ParseException e) ( // crashen en branden throw new IOException("Fout bij het parseren van de queryreeks"); // We werken met gegevens met behulp van methoden als: // int someInt = jsonObject.getInt("intParamName"); // String someString = jsonObject.getString("stringParamName") ; "); // JSONObject nestedObj = jsonObject.getJSONObject("nestedObjName"); // JSONArray arr = jsonObject.getJSONArray("arrayParamName"); // enzovoort... )

    Meer informatie is te vinden in de documentatie voor het org.json-pakket (zie links in de sectie). (Opmerking: als je org.json of andere JSON-software in meer detail wilt verkennen, stuur me dan een e-mail en laat het me weten. Jouw feedback helpt me beslissen waar ik nu over ga schrijven!).

    Conclusie

    Inmiddels zou je het al moeten weten technische kant met behulp van JSON op de server. Maar in deze en artikelen wilde ik er niet alleen meerdere laten zien technische aspecten, maar ook om u ervan te overtuigen dat JSON een zeer flexibel en krachtig dataformaat is. Zelfs als je het niet in elke toepassing gebruikt, moet een goede Ajax- en JavaScript-programmeur dit altijd bij de hand hebben. handig hulpmiddel en in staat zijn om het te gebruiken wanneer dat nodig is.

    Ik zou zeker graag over de jouwe willen horen eigen ervaring werken met JSON en welke talen je denkt dat goed – of misschien niet zo goed – werkt met JSON-data aan de serverkant. Bekijk de Java- en XML-nieuwsgroeppagina (links in) en vertel me erover. Geniet van JSON en alle kracht van tekstgegevensformaten.

    9 antwoorden

    Ik kreeg hier veel informatie, dus ik wilde de oplossing die ik ontdekte posten.

    Probleem: JSON-gegevens ontvangen van Javascript in de browser, op de server en PHP gebruiken om deze succesvol te parseren.

    Omgeving: Javascript in browser (Firefox) op Windows. LAMP-server als externe server: PHP 5.3.2 op Ubuntu.

    Wat werkt (versie 1):
    1) JSON is slechts tekst. Tekst in een specifiek formaat, maar alleen tekstreeks.

    2) In Javascript geeft var str_json = JSON.stringify(myObject) mij een JSON-string.

    3) Ik gebruik een AJAX XMLHttpRequest-object in Javascript om gegevens naar de server te verzenden:
    verzoek= nieuwe XMLHttpRequest()
    request.open("POST", "JSON_Handler.php", true)
    request.setRequestHeader("Contenttype", "application/json")
    request.send(str_json)
    [... code om antwoord weer te geven ...]

    4) Op de server PHP-code om de JSON-string te lezen:
    $str_json = file_get_contents("php://input");
    Hiermee worden de onbewerkte POST-gegevens gelezen. $str_json bevat nu de exacte JSON-string uit de browser.

    Wat werkt (versie 2):
    1) Als ik de verzoekheader "application/x-www-form-urlencoded" wil gebruiken, moet ik een standaard string POST "x=y&a=b" zodat wanneer het PHP krijgen het kan in de associatieve array $_POST worden geplaatst. Dus in Javascript in de browser:

    Var str_json = "json_string=" + (JSON.stringify(mijnObject))

    Nu kan PHP de $_POST-array vullen wanneer ik str_json verzend via AJAX/XMLHttpRequest, zoals in versie 1 hierboven.

    Als u de inhoud van $_POST["json_string"] weergeeft, wordt de JSON-string weergegeven. Het gebruik van json_decode() op een $_POST array-element met een json-string zal die gegevens correct decoderen en in een array/object plaatsen.

    De valkuil die ik tegenkwam:
    Ik probeerde in eerste instantie een JSON-string te verzenden met de applicatieheader /x -www-form-urlencoded en probeerde deze vervolgens onmiddellijk te lezen uit de $_POST-array in PHP. De $_POST-array was altijd leeg. Dit komt omdat het gegevens verwacht in de vorm yval = xval & . Dergelijke gegevens werden niet gevonden, alleen een JSON-tekenreeks, en deze werd gewoon weggegooid. Ik heb naar de verzoekheaders gekeken en de POST-gegevens zijn correct verzonden.

    Op dezelfde manier, als ik de application/json-header gebruik, heb ik opnieuw geen toegang tot de gegevens die via de $_POST-array worden verzonden. Als u de header/json van de app-inhoud wilt gebruiken, moet u toegang krijgen tot de raw POST-gegevens in PHP via php-invoer://, niet met $_POST.

    Literatuur:
    1) Hoe krijg ik toegang tot POST-gegevens in PHP: Hoe krijg ik toegang tot POST-gegevens in PHP?
    2) Gedetailleerde informatie over het application/json-type met enkele voorbeeldobjecten die kunnen worden geconverteerd naar JSON-strings en naar de server kunnen worden verzonden: http://www.ietf.org/rfc/rfc4627.txt< ш >

    JavaScript-bestand jQuery gebruiken (opschoner, maar bibliotheekoverhead):

    $.ajax((type: "POST", url: "process.php", data: (json: JSON.stringify(json_data)), dataType: "json" ));

    PHP-bestand (proces.php):

    Routebeschrijving = json_decode($_POST["json"]); var_dump(routebeschrijving);

    Houd er rekening mee dat als u callback-functies in uw javascript gebruikt:

    $.ajax(( type: "POST", url: "process.php", data: (json: JSON.stringify(json_data)), dataType: "json" )) .done(function(data) ( console.log ("klaar"); console.log(data); ).fail(functie(data) ( console.log("fail"); console.log(data); ));

    U moet in uw PHP-bestand een JSON-object retourneren (in javascript-opmaak) om het resultaat "done/success" in uw bestand te krijgen Javascript-code. Met minimaal retour/bedrukking:

    Afdrukken("()");

    Hoewel je voor iets ernstigers expliciet moet sturen juiste titel met de bijbehorende responscode.

    Er zijn 3 relevante manieren om gegevens vanaf de clientzijde (HTML, Javascript, Vbscript..etc) naar serverkant(PHP, ASP, JSP... enz.)

    1. HTML-formulier Plaatsingsverzoek (GET of POST). 2. AJAX (Dit valt ook onder GET en POST) 3. Cookie

    HTML-berichtaanvraagformulier (GET of POST)

    Dit is de meest gebruikte methode en via deze methode kunnen we meer gegevens verzenden.

    Dit is een asynchrone methode en zou moeten werken op een veilige manier, hier kunnen we ook meer gegevens naartoe sturen.

    Dit goede manier gebruik een kleine hoeveelheid niet-gevoelige gegevens. Dit beste manier werken met een databit.

    In uw geval geeft u wellicht de voorkeur aan HTML-formulierinzending of AJAX. Maar voordat u deze naar de server verzendt, valideert u uw json zelf of gebruikt u een link zoals http://jsonlint.com/

    Als Json Object het naar String converteert met JSON.stringify(object), verzendt u deze zoals deze is als u een JSON-tekenreeks hebt.

    Een eenvoudig JavaScript-voorbeeld voor het invoeren van HTML-velden (JSON naar de server verzenden, de JSON in PHP parseren en terugsturen naar de client) met behulp van AJAX:

    Achternaam
    Leeftijd
    Toon var xmlhttp; functie actionSend() ( if (window.XMLHttpRequest) (// coderen voor

    IE7+, Firefox, Chrome, Opera, Safari xmlhttp = new XMLHttpRequest();