Ukážkový príspevok služby HTTP 1c 8.3. Vypracovanie presmerovania žiadosti http

Od druhej verzie 8 platformy majú používatelia a vývojári možnosť použiť požiadavku http priamo v 1C. Program zároveň podporuje dva typy požiadaviek:

  • Požiadavky POST;
  • ZÍSKAJTE žiadosti.

Bol teda vytvorený pomerne pohodlný nástroj na výmenu údajov a interakciu s webovými službami a službami pracujúcimi cez http.

ZÍSKAŤ požiadavku

Najjednoduchšie príklady použitia dotazov samozrejme ilustrujú ich schopnosti oveľa lepšie ako mnohé riadky popisu. Skúsme teda:

  1. Poďme na telo hlavnej stránky nášho webu;
  2. Vyriešime presmerovanie požiadavky;
  3. Urobme si obrázok z webu.

Získanie tela stránky

Začnime jednoducho. Na obr ..

Výsledkom vykonania tejto časti kódu je pomerne veľký text, ktorého konečná časť je zobrazená na obr.

Obr

V prvom riadku kódu vytvoríme objekt pripojenia k prostriedku http. Objekt môže obsahovať nasledujúce vlastnosti:

  • Server - reťazec pripojenia obsahujúci adresu servera;
  • Port - obsahuje číslo udávajúce port servera, v predvolenom nastavení v závislosti od typu pripojenia môžete zadať 80 pre nezabezpečené pripojenia alebo 443 pre zabezpečené SSL.
  • Používateľské meno - zadajte, ak sa vyžaduje autorizácia na serveri;
  • Heslo - užívateľské heslo pre zadaný zdroj;
  • Proxy - môže obsahovať objekt typu InternetProxy, ktorý je špecifikovaný, keď sa na komunikáciu so serverom používa server proxy;
  • SecureConnection - v predvolenom nastavení je FALSE, prepnutie na TRUE znamená použitie protokolu https.

Objekt HTTPConnection má navyše svoje vlastné metódy, ku ktorým prístup umožňuje úplnejší popis algoritmu vykonávania obsluhy:

  • CallHTTPmethod - obsahuje dva požadované parametre, HTTPmethod a HTTPrequest, podporuje schopnosť zapísať telo odpovede do súboru uvedeného v treťom parametri;
  • Zápis - odosiela údaje na server pomocou požiadavky PUT;
  • Upraviť - upraví objekt spracovaním požiadaviek PATCH;
  • SendForProcessing - metóda indikujúca použitie požiadavky POST, ako vo všetkých predchádzajúcich metódach, musí obsahovať text žiadosti, môže tiež prenášať adresu súboru odpovedí na zápis údajov;
  • Získajte to - podrobnejšie bude popísané nižšie;
  • GetHeaders je ďalšia metóda, ktorá bude použitá v článku;
  • Odstrániť je vlastne požiadavka na odstránenie, ktorá odstráni zdroj odoslaný v požiadavke zo servera.

V druhom riadku vytvoríme požiadavku na vybratý web, text nášho odvolania obsahuje jednu lomku, čo znamená, že chceme dostať domovská stránka... Ak by za lomítkom nasledoval nejaký výraz, napríklad „stránka2“ alebo „správy“, dostali by sme inú stránku.

Tretí riadok vykoná našu požiadavku na server.

Vo štvrtom ukazujeme výsledok.

Vypracovanie presmerovania žiadosti http

Predstavme si situáciu, keď potrebujeme programovo získať výsledok vyhľadávania prostredníctvom ľubovoľného vyhľadávač kľúčom „Žiadosti za 1 s“. Časť kódu potrebná na prístup k službe GOOGLE je zobrazená na obr

Obr

Tu, okrem pre nás už známych konštrukcií, existujú aj Headers a StateCode. Poďme sa s nimi vysporiadať.

StatusCode je štandardná hodnota uvedená v „Žiadosti o pripomienky“ a môže nadobúdať nasledujúce hodnoty:

  1. Ak je všetko v poriadku, hodnota sa vráti v rozsahu od 100 do 299;
  2. V prípade presmerovania sa vráti kód v rozsahu od 300 do 399, v našom prípade úspešné trvalé presmerovanie na zdroj určí kód 301;
  3. V prípade chýb v požiadavke bude mať parameter hodnotu od 400 do 499;
  4. Hodnota v rozsahu 500-599 naznačuje problém so serverom.

Každá stránka má nadpis, v ktorého texte je možné rozlíšiť niekoľko parametrov (obr. 4):

  1. Schéma pripojenia (všetko až do dvoch lomiek "//");
  2. Adresný riadok spojenia;
  3. Používateľské meno a heslo;
  4. Port a hostiteľ pre pripojenie.

Presne toto je rozdelenie, ktoré funkcia SplitAddrString vykonáva. Keď sme teda dostali novú adresu, môžeme stránku uložiť do počítača a otvoriť ju v predvolenom prehliadači (postup Získať stránku).

Obr

Neexistujú žiadne nové funkcie a spôsoby práce s požiadavkami, ktoré v skutočnosti vytvárame Textový dokument z tela stránky a spustite stránku v prehliadači.

Vložíme súbor do koreňa jednotky D a nazveme ho test.

Fotografujeme z webu

Vyvstáva prirodzená otázka: ak nepotrebujeme celý web ako celok, ale potrebujeme iba získať jeho jednotlivé prvky, dá sa to urobiť a ako? Áno môžeš. Programový kód, ktorý vám to umožňuje, je znázornený na obr. 6

Obr

Ako vidíte na obrázku, v tele žiadosti máme kód prvku štruktúry webu, ktorý potrebujeme získať. Táto časť nebola v našom predchádzajúcom popise a musíme sa týmto bodom podrobnejšie zaoberať.

Použili sme prehliadač Opera na prístup na stránku. Má to pre nás jeden dôležitý nástroj, keď kliknete kliknite pravým tlačidlom myši myšou na prvok, môžete vyvolať kontextové menu, ktorého jednou z položiek je „Zobraziť kód prvku“.

Vďaka nemu môžeme získať adresu, ktorá bude použitá v požiadavke. Obr. 7.

POST požiadavka

Na rozdiel od jednoduchých žiadostí Get majú žiadosti POST http textové telo, ktoré je možné uložiť vo forme obyčajného textu aj ako súbory s príponami xml, soap, json. V sieti je mnoho nástrojov na vytváranie textov požiadaviek, ktoré vám umožňujú ladiť a monitorovať vykonávanie určitých požiadaviek.

V 1C má objekt požiadavky HTTP na spustenie požiadavky s konkrétnym textom procedúru SetBodyFromString.

Na platforme 1C Enterprise 8.3 bolo možné vytvárať služby HTTP

S pomocou vstavaného jazyka je teraz možné vytvoriť odpoveď na požiadavku. Zároveň máte pohodlný prístup k telu, hlavičkám a riadku zdroja žiadosť, a je tiež možné vytvárať kód, telo a hlavičky odpoveď podľa vlastného uváženia.

V porovnaní s webovými službami dostupnými na platforme SOAP majú služby HTTP niekoľko výhod:

  • Jednoduché programovanie klientov pre takéto služby;
  • Potenciálne menšie množstvo prenesených dát;
  • Potenciálne menšie výpočtové zaťaženie;
  • Služby HTTP sú orientované na zdroje, zatiaľ čo služby SOAP sú zamerané na akcie.

Databáza ukazuje implementáciu služieb http

Zoznam faktúr služby http

Služba http používala vzory adries URL, implementovalo spracovanie vlastností ParametreURL predmet HTTPServiceRequest
V. tento príklad ukazuje, ako môžete vytvoriť podložku medzi pracovnou základňou a podnikovým webom
Pripojí sa k demo databáze „ Riadenie obchodu 11", V ktorom musíte nastaviť ďalšiu vlastnosť s názvom Webové heslo , kde uložíme heslo pre prístup.
Požiadavka http bude odoslaná parametrom adresy URL: INN ako prihlasovacie meno a heslo.
Pri spracovaní požiadavky sa vytvorí spojenie cez ComConnector na UT (brzdy sú zaručené) a odtiaľ sa vyberie
Netvrdím rýchlosť a bezpečnosť tohto riešenia, je to príklad

Takže. V strome metadát sa objavila nová vetva - služby HTTP
Tvoríme nová služba, zadajte jeho názov a koreňovú adresu URL (zoznam)
Na volanie našej služby http bude použitá koreňová adresa URL
Potom do služby http pridajte šablónu URL a ako šablónu zadajte „ / (Prihlásenie) / (Heslo)“
Takáto šablóna umožní pri spracovaní požiadavky http prijať zodpovedajúcu štruktúru parametrov a ich hodnôt v parametroch URL.
Teraz do nášho vzoru adresy URL pridajte metódu s názvom „get“ a ako metódu http zvoľte GET.
Otvorte obslužný program a napíšte kód
Obsluha metódy je funkcia, ktorá musí vracať hodnotu typu Služba HTTPSOdpoved

Služba http Stav objednávky

Príklad implementuje spracovanie premenných odovzdaných metódou POST, vytvorenie odozvy vo forme html stránky.
Tentoraz sú údaje načítané z databázy, kde sa nachádzajú hs, takže funguje oveľa rýchlejšie ako predchádzajúca služba http.
Pri implementácii pracovný systém dáva zmysel vytvárať objekty v databáze (so službou) a konfigurovať migráciu údajov zo zdrojovej databázy (napríklad v samostatnom procese na pozadí). Pri spracovaní požiadavky http by mal byť výber vykonaný priamo z databázy, kde sa nachádza.

Publikácia

Existuje veľa informácií o inštalácii a konfigurácii webového servera.
Odtiaľto som použil build httpd-2.2.25-win32-x86-openssl-0.9.8y.exe
Nainštalované podľa metódy „Ďalej-Ďalej-Dokončiť“ 🙂
Publikovanie služieb http je na tom istom mieste, kde publikovanie webových služieb bolo a nie je nijako zvlášť odlišné.
Po inštalácii webového servera v režime „Konfigurátor“ prejdite do ponuky „Správa“ - „Publikovanie na webovom serveri“
Na karte „Služby HTTP“ nastavte názov publikácie, webový server, adresár publikácie a označte naše služby (v mojom prípade je názov „web“, Webový server Apache 2.2)
Pri publikovaní sa zodpovedajúce bloky automaticky zapíšu do konfiguračného súboru httpd.conf a server sa reštartuje (pri prvej publikácii)
Kontaktovanie služby http
Príklad: http: // mysite / web / hs / list, kde
môj web- adresa servera (ak je webový server nainštalovaný lokálne - môžete použiť 127.0.0.1)
web- meno uvedené počas publikovania (alias)
hs- povinný segment cesty, ktorý informuje server, že bude prebiehať práca so službami http
zoznam- koreňová adresa URL webovej služby

Testovanie

Zoznam faktúr

http://127.0.0.1/web/hs/list/7705260681/pswMP (Nezabudnite v UT nakonfigurovať dodatočnú vlastnosť pre heslo)

Predpokladá sa, že na prístup do registra dokumentov má používateľ prístup k priamemu odkazu obsahujúcemu DIČ a heslo

Stav objednávky

http://127.0.0.1/web/hs/check

Žiadosť a odpoveď sa nachádzajú na rovnakej adrese URL. Pri vstupe na stránku sa spustí metóda GET, ktorá vráti html formulár

Keď kliknete na „Skontrolovať“, číslo objednávky sa odošle metódou POST na rovnakú adresu URL, odpoveď sa vráti s rovnakým formulárom žiadosti doplneným údajmi o požadovanej objednávke.

V priloženom súbore - vykladanie databázy pre 1C 8.3. Konfigurácia obsahuje 2 služby http (z publikácie), vytváranie komunikačného spojenia s demo základňou UT 11, dokument „Objednávka“.

Čo je potrebné na spustenie a testovanie

  • webový server
  • ľubovoľný webový prehliadač
  • aktuálne vydanie1C: Enterprise 8.3

Pri vývoji postupu pre odosielanie informácií na stránku z 1C s verziou platformy 8.3.9.2170 som narazil na problém: vývojár stránky mi dal možnosť napísať potrebné informácie iba pomocou požiadavky HTTP pomocou metódy PUT.

Bez rozmýšľania som si zapísal jednoduchý kód:

Pripojenie = Nové pripojenie HTTP („www.mysite.ru“); Nadpisy = Nový zápas; Headers ["Content-Type"] = "application / x-www-form-urlencoded"; Request = New HTTPRequest (" / api / order_items / 93076? Order_item = 30", hlavičky); Connection.Write (požiadavka);

Podľa výsledkov exekúcie malo byť množstvo tovaru prijatého v sklade zadané do zodpovedajúceho riadka objednávky kupujúceho na mieste.

Ako ste však už asi pochopili, nič sa nestalo. Potom, čo som sa ubezpečil, že na webe nie sú žiadne chyby (odoslaním podobnej žiadosti prostredníctvom doplnku Chrome), som bežal na svojom miestny počítač webový server a začal experimentovať.

Zvláštna vec okamžite vyšla najavo: vyššie uvedený kód nevygeneruje požiadavku PUT, ale HEAD!

V denníkoch Apache som videl nasledujúce:

127.0.0.1 - - "HEAD / api / order_items / 93076? Order_item = 30 HTTP / 1.1"

Bol som trochu prekvapený (v príručke bolo napísané čiernobielo PUT), ale nebol som zmätený - metódu môžete zavolať priamo:

Connection.CallHTTPMethod ("PUT", požiadavka);

Protokoly sú rovnaké:

127.0.0.1 - - "HEAD / api / order_items / 93076? Order_item = 30 HTTP / 1.1"

„Možno robím niečo zle?“ - položil som si otázku. Na internete a v príručkách však neboli žiadne stopy. Vedecká metóda poke ešte nebola zrušená. Najprv som sa pokúsil urobiť toto:

Connection.CallHTTPMethod ("fwfw", požiadavka);

V denníkoch som dostal:

127.0.0.1 - - "?????? / api / order_items / 93076? Order_item = 30 HTTP / 1.1"

Kuriózne to znamená, že 1C konkrétne nahrádza metódu PUT (prečo 1C nepotešila?).

Po niekoľkých ďalších pokusoch som prišiel na možnosť:

Connection.CallHTTPMethod ("PUT", požiadavka);

V denníkoch som dostal:

127.0.0.1 - - "PUT / api / order_items / 93076? Order_item = 30 HTTP / 1.1"

A táto možnosť už na stránke fungovala a všetci boli spokojní.

Navrhol správnejšie riešenie problému: je potrebné nastaviť telo žiadosti, akékoľvek, dokonca prázdne. Táto možnosť bude fungovať napríklad:

Pripojenie = Nové pripojenie HTTP („www.mysite.ru“); Nadpisy = Nový zápas; Headers ["Content-Type"] = "application / x-www-form-urlencoded"; Request = New HTTPRequest (" / api / order_items / 93076? Order_item = 30", hlavičky); Request.SetBodyFromString ("", TextCode.UTF8, UsingByteOrderMark.D Nepoužívať); Connection.Write (požiadavka);

A už je pravdepodobne celkom správne odovzdať samotné hodnoty parametrov do tela žiadosti.

Záver je nasledujúci: platforma 1C považuje požiadavku PUT bez tela za chybnú a nahrádza metódu HEAD.

Je zvláštne, že 1C nesleduje požiadavku POST bez tela a nijako z neho neurobí GET, bolo to skontrolované kvôli záujmu o šport.

Ako by povedal známy Malý Johnny zo známej anekdoty: „Kde je logika?“

Dúfam, že niekomu moja publikácia zachráni niekoľko hodín života pri hľadaní odpovede. =)))