Överför data till postmetoden i JSON-format. Nodejs.


JSON (JavaScript Object Notation) är ett format för att dela data i textformulär. Så att du kan överföra komplexa datastrukturer i serialiserad form. Detta dataöverföringsformat har blivit så populärt att redan i PHP-kärnan från version 5.2.0, tillsattes databehandlingsfunktionerna i detta format. Och det betyder att det inte finns något behov av att ansluta ytterligare förlängningar. JSON-dataformat är väl förstått av människan. Dessutom används denna typ av datautbyte i stor utsträckning mellan olika service API. Och med rätt utveckling av algoritmer för utbyte av information, kan du få en mycket höghastighetsförstärkning än, till exempel när du arbetar med data i XML-format.

Skicka data

Du kan skicka data i JSON-format på två sätt: för att bilda en Få eller efter en fråga med kodad data som finns i GET eller POST-variabeln eller sätt in data i dokumentkroppen. I praktiken används vanligtvis det andra alternativet.

För att skicka data behövs följande funktioner:

  • sträng json_encode. (Blandat värde [, int Ertions \u003d 0])

    Värdesparametern indikerar de data som du vill koda. Stöder någon typ utom typ resurs. Alternativparametern innehåller en bettmask från möjliga värden som tillhandahålls (se tabell med JSON som tillhandahålls av konstanter).

  • resurs. stream_context_create. (])

    Den här funktionen är utformad för att skapa och returnera strömkontexten med de alternativ som anges i alternativparametern. Den valfria options-parametern måste ha en typ av associativ array. Ursprungligen är det tomt. Den andra valfria parameterparameterna bör också vara en associativ array i $ dataformat ['name'] \u003d värde.

  • sträng file_get_contents. (Strängfilnamn [, bool use_include_path [, resurskontext [, int offset [, int maxlen]]]]

    Med hjälp av den här funktionen kan du få innehållet i filen som en sträng. Filnamn Parameter är namnet på läsfilen. I parametern Använd_include_Path, som börjar från PHP 5-versionen kan du använda en konstant File_use_include_path Att söka efter en fil i Inkludera sökväg. Kontextparametern representerar den kontextresurs som skapats med funktionen Stream_Context_Create (). I händelse av ett misslyckat försök att öppna filen kommer värdet att returneras falsk. Offset-parametern innehåller en förskjutning från vilken data börjar. Maxlen-parametern indikerar storleken på de erhållna data.

    Notera: Offset anges inte när du arbetar, med avlägsna trådar.

Nedan är ett exempel på att skicka data i JSON-format:

// Data för att skicka $ Request \u003d Array ("StartDate" \u003d\u003e "2013-10-10", "enddate" \u003d\u003e "2013-10-10", "IDS" \u003d\u003e Array (1,2,3,4 , 5,6,7)); // Ange alternativ för Flow Context $ Options \u003d Array ("http" \u003d\u003e array ("metod" \u003d\u003e "post", "header" \u003d\u003e "Innehållstyp: Application / JSON; charset \u003d UTF-8 \\ r \\ N "," innehåll "\u003d\u003e jon_encode ($ begäran))); // Skapa en strömkontext $ Context \u003d Stream_Context_Create ($ Options); // skicka data och erhålla resultatet echo file_get_contents ("http://test.ru/json.php", 0, $ sammanhang);

Detta använder en improviserad datastruktur som består av det ursprungliga och sista dagen, såväl som uppsättningen av några villkorliga poster. Observera att i begäran om begäran Innehållstyp. Typ av "Application / JSON" anges.

Data erhållande

För att erhålla de överförda data som beskrivits ovan är det nödvändigt att läsa data från ingångsströmmen " pHP: // Input”.

Begagnade funktioner för data acceptans:

  • blandad. json_decode. (String JSON [, bool assoc \u003d false [, int Djup \u003d 512 [, int options \u003d 0]]])

    Den här funktionen avkodar strängen i JSON-format. JSON-parametern indikerar en sträng för avkodning. Assoc-parametern är ansvarig för om de returnerade dataen omvandlas till en associativ array. Om ett sådant behov är tillgängligt måste du ange som värdet av denna parameter sann.. Djupparametern indikerar skärmdjupet. Och den sista fjärde alternativparametern innehåller en bit mask av alternativ för avkodning. Hittills stöds endast Json_bigint_as_string (Som standard ges stora heltal till flytande semikolon (flottör))

  • resurs. fopen. (Strängfilnamn, strängläge [, bool use_include_path [, resurskontext]])

    Öppnar filen och returnerar dess deskriptor. Filnamn Parameter är en namngiven resurs som indikerar filen. MODE-parametern indikerar typen av filåtkomst (se tabell med en lista över möjliga lägen för Fopen ()). Nästa Gå två valfria parametrar Detta är: använd_include_path och kontext. När du installerar användaren_include_path-parametern till värdet sann. eller 1 Och, förutsatt att den relativa vägen är inställd som en namngiven resurs, ses en sökning efter en öppen fil i listan Kataloger som används av funktionerna. omfatta. och behöva. I praktiken används denna parameter praktiskt taget inte. Kontextparametern används för att ange resurskontexten.

  • sträng stream_get_contents. (Resurshandtag [, int maxlen \u003d -1 [, int offset \u003d -1]])

    Med den här funktionen kan du få innehållet i strömmen i form av en sträng. Handtagsparametern är en strömresurs. Maxlen-parametern innehåller det maximala antalet Read Byte. Som standard är det inställt på -1, vilket indikerar att erhålla all data. Offset-parametern innehåller en förskjutning från vilken data börjar. Som standard är den också installerat i -1, vilket innebär att läsning kommer att produceras från den ursprungliga positionen.

Nedan är ett exempel på att få data i JSON-format på serverns sida:

// Upptäck flödesströmmen på $ F \u003d Fopen ("PHP: // Input" ("PHP: // Input", "R"); // Vi får innehållet i $ Data Stream \u003d Stream_Get_Contents ($ f); Om ($ data) (// bearbetningskod Print_r (JSON_DECODE ($ data));)

Den resulterande datastrukturen:

STDClass Object (\u003d\u003e 2013-10-10 \u003d\u003e 2013-10-10 \u003d\u003e Array (\u003d\u003e 1 \u003d\u003e 2 \u003d\u003e 3 \u003d\u003e 4 \u003d\u003e 5 \u003d\u003e 6 \u003d\u003e 7))

Notera: Det är nödvändigt att ta hänsyn till det ögonblick som ska fungera med JSON-format, ska data vara i UTF-8-kodningen.

Tillhandahålls av JSON-konstanter för JSON_Encode-funktionen ()

JSON_HEX_TAG (heltal) Alla är kodade i \\ u003c och \\ u003e. Finns från PHP 5.3.0.
Json_hex_amp (heltal) Alla & kodas i \\ U0026. Finns från PHP 5.3.0.
JSON_HEX_APOS (heltal) Alla tecken "kodas i \\ u0027. Finns från PHP 5.3.0.
Json_hex_quot (heltal) Alla tecken kodas i \\ u0022. Från PHP 5.3.0, börjar med PHP 5.3.0.
JSON_FORCE_OBJECT (heltal) Hämta ett objekt istället för en array när du använder en icke-cassociative-array. Detta är användbart när värdprogrammet eller koden förväntar sig ett objekt eller en array är tom. Finns från PHP 5.3.0.
Json_numeric_check (heltal) Kodningslinjer som innehåller siffror som siffror. Finns från PHP 5.3.3.
Json_bigint_as_string (heltal) Kodar stora heltal i form av deras strängekvivalenter. Börjar med PHP 5.4.0.
Json_pretty_print (heltal) Använd rymdfarkosten i returdata för att formatera dem. Börjar med PHP 5.4.0.
JSON_UNESCAPED_SLASHES (heltal) Skydda inte /. Börjar med PHP 5.4.0.
Json_unescaped_unicode (heltal) Koka inte multibyal unicode-tecken (som standard kodas de som \\ uxxxx). Börjar med PHP 5.4.0.

Lista över möjliga lägen för fopen () med användning av läge

'R' Öppnar läsaren bara för att läsa; Placerar en pekare till början av filen.
'R +' Öppnar en fil för läsning och skrivning; Placerar en pekare till början av filen.
'W' Öppnar filen endast för inspelning; Det placerar pekaren i början av filen och skär filen till nolllängd. Om filen inte existerar - försöker du skapa den.
'W +' Öppnar en fil för läsning och skrivning; Det placerar pekaren i början av filen och skär filen till nolllängd. Om filen inte existerar - försöker du skapa den.
'A' Öppnar filen endast för inspelning; Placerar en pekare till slutet av filen. Om filen inte existerar - försöker du skapa den.
'A +' Öppnar en fil för läsning och skrivning; Placerar en pekare till slutet av filen. Om filen inte existerar - försöker du skapa den.
'X' Skapar och öppnar bara för att spela in; Placerar en pekare till början av filen. Om filen redan finns, kommer samtalet Fopen () att misslyckas, False kommer att återvända och ge ett e_warning nivåfel. Om filen inte existerar kommer det att försöka skapa det. Detta motsvarar instruktionerna från O_EXCL | O_CREAT Flags för det interna systemsamtalet öppet (2).
'X +' Skapar och öppnar för läsning och skrivning; Annars finns det samma beteende som och'x '.
'C' Öppnar bara filen för inspelning. Om filen inte existerar skapas den. Om filen finns, är det inte klippt (i motsats till "W '), och samtalet till den här funktionen orsakar inte ett fel (såväl som i fallet med" x "). Pekaren till filen kommer att ställas in till början av filen. Det här kan vara användbart om du vill blockera filen (se flock ()) innan du ändrar, eftersom användningen av "W" kan trimma filen innan blockeringen erhölls (om du vill beskära filen, kan du använda ftricate () Funktion efter låsfrågan).
'C +' Öppnar en fil för läsning och skrivning; Annars finns det samma beteende som 'c'.

Jag har en registreringssida för att tillåta användare att registrera sig. Före registrering måste jag bekräfta ditt telefonnummer. Jag gav en webbtjänstadress tillsammans med sina parametrar.
Parametrarna som jag gav:

Http: // ********* Metod: POST HEADERS: Innehållstyp: Ansökan / JSON-kropp: följande i: ("MobileNo": "0 *********", " Service ":" **** "," Code1 ":" ***** "," Innehåll ":" Hej "," ActionDate ":" 2017/09/26 "," Requestid ":" 1 ")

och här är koden som jag hittade på Internet:

$ Data \u003d Array ("MobileNo" \u003d\u003e "****", "Service" \u003d\u003e "***", "Code1" \u003d\u003e "*****", "Innehåll" \u003d\u003e "55", "ActionDate" \u003d\u003e "2017/09/26"); $ Alternativ \u003d Array ("http" \u003d\u003e array ("metod" \u003d\u003e "post", "innehåll" \u003d\u003e jon_encode ($ data), "header" \u003d\u003e "Innehållstyp: Application / JSON". "Acceptera: Ansökan / JSON ")); $ url \u003d "******"; $ Sammanhang \u003d stream_context_create ($ alternativ); $ resultat \u003d file_get_contents ($ url, falskt, $ sammanhang); $ Response \u003d JSON_DECODE ($ resultat);

och här är ett misstag som jag stöter på när jag kontrollerar lokala:

File_Get_Contents (http: // ******** / SMS-Gateway / SMS-externzon / mottagning): Misslyckades med att öppna ström: Ett anslutningsförsök misslyckades eftersom den anslutna parten inte svarade efter en tidsperiod , Eller etablerad anslutning misslyckades eftersom ansluten värd har misslyckats med att svara.

och inget fel och inget resultat (få SMS) som svar när jag testar online (cPanel-servern)

Enligt de angivna parametrarna, var är jag fel?

tack på förhand.

Beslut

Att döma med ditt fel, svarar din tjänst inte. Har du försökt öppna den i webbläsaren för att kontrollera om det finns ett svar där?

Kanske den tjänst du försöker ringa kräver att du ger en statisk IP-adress från din webbserver, eftersom de endast ger tillgång till IP. Så är din IP blockerad tills de aktiverar.

Jag föreslår att du använder CULL för att utföra din förfrågan. Således får du framtida data för felsökning om något misslyckas. Även här om tjänsten inte svarar, vill du få någon annan information.

$ Data \u003d Array ("MobileNo" \u003d\u003e "****", "Service" \u003d\u003e "***", "Code1" \u003d\u003e "*****", "Innehåll" \u003d\u003e "55", "ActionDate" \u003d\u003e "2017/09/26"); $ url \u003d "******"; $ ch \u003d curl_init ($ url); // Ange data som JSON STRING CURL_SETOPT ($ ch, curlopt_postfields, jon_encode ($ data)); // definiera JSON som innehållstyp CURL_SETOPT ($ CH, CULLOPT_HTTPHEADER, Array ("Innehållstyp: Application / JSON")); // Berätta CURL för att hämta returdata CURL_SETOPT ($ CH, CURLOPT_RETURNTRANSFER, sant); // Följ plats om omdirigering händer som http till https curl_setopt ($ ch, curlopt_follocation, 1); // skicka förfrågan $ resultat \u003d curl_exec ($ ch); // ger dig resultatet - de flesta av tiden du bara vill ha den här Var_dump ($ resultat); // För debugging syfte, ger dig hela anslutningsinformationen Var_Dump (Curl_getInfo ($ CH)); // ger tillbaka någon inträffad Errs Var_Dump (Curl_Error ($ CH)); Curl_close ($ ch);

Jag fick mycket information här, så jag ville publicera det beslut jag upptäckte.

Problem: Ta emot JSON-data från JavaScript i webbläsaren, på servern och användningen av PHP för att framgångsrikt analysera den.

Onsdag: Javascript i webbläsaren (Firefox) i Windows. Lamp Server som en fjärrserver: PHP 5.3.2 på Ubuntu.

Vad fungerar (version 1):
1) JSON är bara text. Text i ett visst format, men bara en textsträng.

2) I JavaScript, VAR STR_JSON \u003d JSON.Stringify (MyObject) ger mig en JSON-sträng.

3) Jag använder Ajax Xmlhttprequest-objektet i JavaScript för att skicka data till servern:
Begäran \u003d Ny XMLHTTPREQUEST ()
Förfrågan.Open ("Post", "JSON_Handler.php", sant)
Request.SetRequestHeader ("Innehållstyp", "Application / JSON")
Request.Send (Str_json)
[... kod för att visa svar ...]

4) På PHP-kodservern för att läsa JSON-strängen:
$ str_json \u003d file_get_contents ("PHP: // Input");
Detta läser de obearbetade postdata. $ STR_JSON innehåller nu den exakta raden av JSON från webbläsaren.

Vad fungerar (version 2):
1) Om jag vill använda "Application / X-www-form-urlencoded" Request-rubriken måste jag skapa en vanlig eftersträng "x \u003d y & a \u003d b" så att när den tar emot php kan det placeras i en associativ $ _post array. Så, i JavaScript i webbläsaren:

Var str_json \u003d "json_string \u003d" + (Json.Stringify (myObject))

Nu kommer PHP att kunna fylla i en rad $ _Post när jag skickar Str_json via Ajax / Xmlhttprequest, som i version 1 ovan.

Visar innehållet på $ _Post ["JSON_String"] för att visa JSON-strängen. Använda JSON_DECODE () I ett arrayelement $ _Post med JSON-strängen, kommer den att avkoda dessa data ordentligt och placera dem i en array / objekt.

Den fälla som jag stött på:
Inledningsvis försökte jag skicka en JSON-sträng med en applikationshuvud / x -www-form-urlencoded, och försökte omedelbart läsa den från en array $ _Post i PHP. Den $ _POST-array har alltid varit tom. Detta beror på att det förväntar sig Yval \u003d XVAL & Data. Han hittade inte sådana data, bara JSON-strängen, och han kastade det bara bort. Jag tittade på Query-rubriker, och postdata skickades korrekt.

På samma sätt, om jag använder programmet / JSON-rubriken, kan jag inte få tillgång till de data som skickas via en $ _POST-array igen. Om du vill använda innehållsrubriken för / JSON-programmet, bör du få tillgång till de råa postdata i PHP via PHP-ingången: //, och inte med $ _Post.

Litteratur:
1) Hur får du tillgång till PHP-data i PHP: Så här får du tillgång till PHP-data?
2) Detaljer om applikation / JSON-typen med några exemplifierande föremål som kan omvandlas till JSON-strängar och skickas till servern:

Så här skickar du Ajax Object List (lista) i JSON-format

Exempel 1.

$ (Dokument). (Funktion () ($ ("Body"). På ("Klicka på", "-knappen", funktion () (Varoduct \u003d Json.Stringify (("Namn": $ ("TextArea"). Val (), "Kostnad": $ ("Input"). Val (),)); Console.log (produkt); $ .ajax ((URL: "/ Produkter / Ajaxcreate /", Metod: "Post", ContentType: "Application / JSON", data: produkt, framgång: funktion (svar) (konsol.log (svar))));));));

Kontroller

Offentlig ActionResult Ajaxcreate (Retur JSON (resultat \u003d "Framgång), JsonRequestbehavior.allowget);)

Exempel 2.

// spara fakturan $ ("Body"). På ("Klicka på", "-knappen", funktion () () // Samla in bordet som en mängd objekt var billdetails \u003d; $ (". Artikeln"). Varje (funktion () .find (". Namn"). Val (); // Namn VAR Quantity \u003d Parseint ($) .Find (".Quantity"). Val ()); // nummer var pris \u003d parsefloat ($ (det här) .Find (". Pris"). Val ()); // pris var summ \u003d parsefloat ($ (detta) .find (".Item-summ"). ATT ("Värde")); // mängd var produktid \u003d parsefloat ($ (detta) .Find (". Artikel-ID"). ATT ("värde")); // ID ID VAR ProductsKuid \u003d Parseint ($ (detta ) .Find (". Artikel-SKU-ID"). ATT ("värde")); // id shopping erbjudande Var notrec \u003d $ (det här) .find (". Artikel-inte-rec"). Prop ("kontrollerad"); // ta hänsyn till produkten eller inte BILLDETAILS.PUSH ((Namn: Namn, Antal: Antal Pris: Pris, summa: Summ, ProductID: ProduktId, ProductsKuid: ProductsKuid, Notrec: Notrec)); )); Console.log (Billdetails); Billdetails \u003d Json.Stringify (("Billdetails": Billdetails)); // vända sig till stethem // Skicka för att spara $ .AJAX ((URL: "/ Bills / AjaxSaveInvoiceBill /", Metod: "Post", ContentType: "Application / JSON", Data: Billdetails, Framgång: Funktion (svar) (Window.Location.replace ("/ / Bills / Lista / ");))); Returnera false; ));

Kontroller

Offentlig ActionResult AjaxSaveInviceBill (lista Billdetails) (om (BillDetails.Count \u003d\u003d 0) returnera JSON (nytt (resultat \u003d "fel", meddelande \u003d "Det finns inga varor i fakturan"), JsonRequestbehavior.allowget); // Skapa en ny församlingsfaktura, få det ID Long Billid \u003d Bill.CreateBill (BillTypes.invoice); // spara nu varje position under ID för den nya fakturan BILLDETAIL.SAVEBILLDETAILS (BILLDETAILS, BILLID); Returnera JSON (nytt (resultat \u003d "framgång", meddelande \u003d "Fakturan har skapats framgångsrikt"), JsonRequestbehavior.allowget); )

Ajax begäran till styrenheten och tar emot ett JSON-svar

$ (Dokument). (Funktion () ($ .AJAX (URL: "/ Leverantörer / AjaxgetSupplierslist /", Metod: "Få", Framgång: Funktion (Data \u003d Json.Stringifyify (Response.Suppliers); Var List \u003d Eval ("(" + data + ")"); föreslå_count \u003d list.length; om (föreslå_count\u003e 0) ($ (". Leverantör-Välj"). Töm (); // Rengör listan över element // Den resulterande listan med element kommer att läggas till urvalet $ .EAk (svar. Uppfyllare, funktion (nyckel, värde) ($ (". Leverantör-Välj"). Lägg till (" "); }); } } }); });

Kontroller

Offentlig ActionResult AjaxGetsUppliersList () (Lista leverantörer \u003d leverantörer.getsuppgifter (); Retur JSON (NY (leverantörer), JsonRequestbehavior.allowget);)

Hej alla! I den här artikeln kommer vi att titta på hur skickar du data till klienten i JSON-format i Nodejs.

Introduktion

I den sista artikeln tittade vi på hur man skickade Html Sidor till klienten, med hjälp av flöden i Nodejs.. Idag ser vi på hur man skickar data i format JSON..

Vi använder inte strömmar för att lösa den här uppgiften, så du kan radera all koden relaterad till dem. I stället kommer vi att använda slutet () Metoden som vi redan är bekant och tillämpades i en av de tidigare artiklarna.

Hur man skickar JSON.

Först och främst måste vi ändra titeln så att webbläsaren kan behandla våra data:

Res.writehead (200, ("innehållstyp": "ansökan / json");

Låt oss nu skapa det objekt vi vill skicka till klienten:

Var myobj \u003d (
Namn: "John",
Job: "Programmerare",
Ålder: 27.
};

Låt oss nu skicka data till klienten:

Res.end (myobj);

Men i själva verket fungerar den här koden inte korrekt. Saken är att metoden slutet () Det förväntar sig att se data i strängformatet eller bufferten. Vi har också ett objekt, men vi kan göra en sträng från det enligt följande:

Res.end (Json.Stringify (myobj));

Nu, om du kör programmet, kommer du att se att data kom till JSON. format i form av en sträng. Du kan också använda utvecklarverktygen i webbläsaren och se vad titeln också installerades korrekt.

Varför skicka JSON-data till klienten

Du kanske har en fråga, och varför i allmänhet skickar data till klienten i JSON. formatera. För att svara på den här frågan, föreställ dig att du har någon javascript.kör på klientsidan ( frontend), Och han kan skapa någon begäran. Till exempel har du API.. Du kan skriva följande förfrågan:

Localhost: 3000 / API / Begäran

Och servern måste skicka oss data på den här förfrågan. Det kommer mest bekvämt att skicka dem i formatet JSON.Så att skriptet som körs på klientsidan kan enkelt bearbeta dessa data.

Slutsats

Så idag granskade vi hur skickar du data till klienten i JSON-format i Nodejs.







2021. gtavrl.ru..