1c příklad práce s hlavičkami požadavku http. Zpracování přesměrování požadavku http

Zde je příklad zpracování souboru XML s protistranami na straně serveru:

VBS kód
required_once dirname(__FILE__) . "/../inc/initf.php" ;
třída Onec_Import_Customers (
soukromý statický $instance ;
funkce __construct())(

Self::$instance = $toto ;

Public function process() (
$rawHttp = file_get_contents("php://input");
$xml_raw = str_replace("xml=", "", $rawHttp) ;

If ($_SESSION["loggedin"] || true)(
file_put_contents("log/onec_import_customers_" .time(). ".log", "REQUEST" . print_r($_REQUEST, 1) . " SERVER " . print_r($_SERVER,1). " FILES " . print_r($_FILES, 1) .$xml_raw);
file_put_contents("log/onec_import_customers_last.log", "REQUEST" . print_r($_REQUEST, 1) . " SERVER " . print_r($_SERVER,1). " FILES " . print_r($_FILES,1) . $xml_raw) ;

//$xml = stripslashes($_POST["xml"]);
$xml = stripslashes($xml_raw);
if(!$xml) (
$xml = $xml_raw ;
//die ("žádná data XML (klíč příspěvku "xml")") ;
}
if ($this->setCustomers($xml)) (
zemřít("OK");
) jinak (
zemřít("FAIL");
}
) jinak (
zemřít();
}
}

Soukromá funkce setCustomers($xml)(
$db = db::getInstance() ;

$sxml = simplexml_load_string($xml) ;

$customers = $sxml->("Договор”) ? $sxml->("РІРѕРіРѕРІРѕСЂ") : self::err("Neplatný formát souboru. Zákazníci.") ;

$final = pole () ;
$k = 0;

$allCustomers = pole () ;

Foreach ($customers jako $cust) (
$heslo = base::generatePassword(6,1) ;

$arr ["heslo"] = $heslo ;

$arr ["e-mail"] = (pole)$cust->("Почта") ;//? (pole)$cust->("Почта") : self::err("Neplatný formát souboru. Číslo zákazníka:" . $k . ". Neplatný email") ;
$arr ["e-mail"] = $arr ["e-mail"] ? $arr ["e-mail"] : "";//: self::err("Neplatný formát souboru. číslo zákazníka:" . $k . ". Neplatný e-mail" ;

$arr ["app_name"] = (pole)$cust->("РќР°Ременование") ;//? (pole)$cust->("РќР°Ременование") : self::err("Neplatný formát souboru. Číslo zákazníka:" . $k . ". Neplatný název") ;
$arr ["app_name"] = $arr ["app_name"] ? $arr ["název_aplikace"] : "";//self::err("Neplatný formát souboru. číslo zákazníka:" . $k . ". Neplatné jméno") ;

$arr ["clientid"] = (pole)$cust->("Номер") ? (pole)$cust->("Номер") : self::err("Neplatný formát souboru. Číslo zákazníků:" . $k . ". Neplatné ID klienta" ;
$arr ["clientid"] = $arr ["clientid"] ? $arr ["clientid"] : self::err("Neplatný formát souboru. Zákaznické číslo:" . $k . ". Neplatné clientid" ;

$arr ["datum"] = (pole)$cust->("Дата”) ? (pole)$cust->("Дата") : self::err("Neplatný formát souboru. Číslo zákazníků:" . $k." ". Neplatné datum" ;
$arr ["datum"] = $arr ["datum"] ? $arr ["datum"] : self::err("Neplatný formát souboru. Číslo zákazníků:" . $k . ". Neplatné datum" ;

$arr ["datum"] = explode(".",$arr ["datum"]);
krsort($arr ["datum"]);
$arr ["datum"] = implode("-",$arr ["datum"]) . "00:00:00" ;

$arr ["phone_home"] = (pole)$cust->("ТелефоРS") ;//? (pole)$cust->("ТелефоРС") : self::err("Neplatný formát souboru. Číslo zákazníků:" . $k . ". Neplatný telefon") ;
$arr ["phone_home"] = $arr ["phone_home"] ? $arr ["phone_home"] : "";//self::err("Neplatný formát souboru. Číslo zákazníka:" . $k . ". Neplatný telefon" ;

$arr ["okres"] = (pole)$cust->("РайоРС") ;//? (pole)$cust->("айон") : self::err("Neplatný formát souboru. Číslo zákazníků:" . $k . ". Neplatný okres" ;
$arr ["okres"] = $arr ["okres"] ? $arr ["okres"] : "";//self::err("Neplatný formát souboru. Číslo zákazníků:" . $k . ". Neplatný okres" ;

$arr ["ulice"] = (pole)$cust->("Улица") ;//? (pole)$cust->("Улица") : self::err("Neplatný formát souboru. Číslo zákazníků:" . $k . ". Neplatná ulice") ;
$arr ["ulice"] = $arr ["ulice"] ? $arr ["ulice"] : "";//self::err("Neplatný formát souboru. Číslo zákazníků:" . $k . ". Neplatná ulice" ;

$arr ["budova"] = (pole)$cust->("Дом”) ;//? (pole)$cust->("Дом") : self::err("Neplatný formát souboru. Číslo zákazníků:" . $k . ". Neplatná budova") ;
$arr ["budova"] = $arr ["budova"] ? $arr ["budova"] : "" ;//self::err("Neplatný formát souboru. Číslo zákazníka:" . $k . ". Neplatná budova" ;

$arr ["apartmán"] = (pole)$cust->("КвартиСР°") ;//? (pole)$cust->("Квартира") : self::err("Neplatný formát souboru. Číslo zákazníků:" . $k . ". Neplatný byt" ;
$arr ["apartmán"] = $arr ["byt"] ? $arr ["apartament"] : "";// self::err("Neplatný formát souboru. Číslo zákazníka:" . $k . ". Neplatný byt" ;

$allCustomers [$arr ["clientid"]]= array("password"=>$password, "email"=>$arr ["email"]) ;

$final = $arr ;
+$k ;
}

Return $this->buildCustomers($final) ;
/*
if($this->buildCustomers($final)) (
foreach ($allCustomers jako $clientid=>$data) (
self::sendPasswordToMail($data["email"], $clientid, $data["heslo"]) ;
}
}*/

Soukromá statická funkce sendPasswordToMail($email, $client_id, $password) (
$db = db::getInstance() ;
$config = config_model::getInstance() ;
$lng = Požadavek::$currentLang["id"] ;
$email_text = $db->getRow("s1_text", "*", "`alias`="registrace_ok" AND `lng_id`="($lng)"");
$body = str_replace("%heslo%", $heslo, $email_text["obsah"]) ;
$body = str_replace("%client_id%", $client_id, $body) ;
base::mailSend($body, $email_text["title"] . " - " . $config->defaultTitle("site.ru") , $email, $app["app_name"], $config->site_admin_mail( " [e-mail chráněný]"), $config->from_name("site")) ;

Soukromá funkce buildCustomers ($data) (

$db = db::getInstance() ;

$qry = "I_nsert INTO s1_customer (`aktivní`,`heslo`,`název_aplikace`,`e-mail`, `datum`, `clientid`, `phone_home`, `ulice`, `okres`, `budova`, `byt `) HODNOTY " ;
foreach ($data jako $rows)(
$queryArr = "(
"0"
,MD5("($rows["heslo">")
"($db->escape($rows["app_name"]))"
"($db->escape($rows["e-mail"]))"
"($db->escape($rows["date"]))"
"($db->escape($rows["clientid"]))"
"($db->escape($rows["phone_home"]))"
"($db->escape($rows["ulice"]))"
"($db->escape($rows["okres"]))"
"($db->escape($rows["budova"]))"
"($db->escape($rows["byt"]))"
)" ;
}
$qry .= implode(",", $queryArr) ;
$qry .= " PŘI AKTUALIZACI DUPLIKÁTNÍHO KLÍČE
`app_name` = VALUES(app_name)
,`datum` = VALUES(datum)
,`e-mail` = VALUES(e-mail)
,`phone_home` = VALUES(phone_home)
,`ulice` = VALUES(ulice)
,`okres` = HODNOTY(okres)
,`budova` = VALUES(budova)
,`byt` = HODNOTY(byt)
" ;
return $db->query($qry) ;
}

Veřejná statická funkce getInstance())(
if (!self::$instance)
{
new self() ;
}
return self::$instance ;

Soukromá statická funkce err($msg) (
hodit novou ImportException($msg) ;
}

Třída ImportException rozšiřuje výjimku (

Funkce __construct ($msg) (
zemřít ("Chyba: " . $msg) ;

Při vývoji postupu pro odesílání informací z 1C na web s verzí platformy 8.3.9.2170 jsem narazil na problém: vývojář webu mi dal možnost zaznamenat nezbytné informace pouze pomocí HTTP požadavku pomocí metody PUT.

Bez přemýšlení jsem načrtl jednoduchý kód:

Connection = New HTTPConnection("www.mysite.ru"); Záhlaví = Nová shoda; Headers["Content-Type"] = "application/x-www-form-urlencoded"; Request = New HTTPRequest("/api/order_items/93076?order_item=30", Hlavičky); Connection.Write(Požadavek);

Na základě výsledků provedení mělo být množství zboží přijatého na sklad zadáno do odpovídajícího řádku objednávky kupujícího na webu.

Jak jste však již pravděpodobně pochopili, nic se nestalo. Poté, co jsem se ujistil, že na webu nejsou žádné chyby (odesláním podobného požadavku prostřednictvím pluginu Chrome), spustil jsem jej na svém místní počítač webový server a začal experimentovat.

Okamžitě se vyjasnila podivná věc: Výše uvedený kód negeneruje PUT, ale požadavek HEAD!

V protokolech Apache jsem viděl následující:

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

Trochu mě to překvapilo (v návodu to bylo napsáno černobíle PUT), ale nezmátl jsem - metodu můžete zavolat přímo:

Connection.CallHTTPMetoda("PUT",Požadavek);

Protokoly ukazují to samé:

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

"Možná dělám něco špatně?" - položil jsem si otázku. Ale na internetu ani v příručkách nebyly žádné náznaky. No, metodu vědeckého tykání ještě nikdo nezrušil. Pro začátek jsem zkusil udělat toto:

Connection.CallHTTPMetoda("fyvfyv",Požadavek);

V protokolech, které jsem obdržel:

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

Kupodivu to znamená, že 1C nahrazuje konkrétně metodu PUT (proč se to 1C nelíbilo?).

Po několika dalších pokusech jsem přišel na toto:

Connection.CallHTTPMetoda("PUT",Požadavek);

V protokolech, které jsem obdržel:

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

A tato možnost již na webu fungovala a všichni byli spokojeni.

Navrhl správnější řešení problému: musíte zadat tělo požadavku, jakékoli tělo, dokonce i prázdné. Například tato možnost bude fungovat:

Connection = New HTTPConnection("www.mysite.ru"); Záhlaví = Nová shoda; Headers["Content-Type"] = "application/x-www-form-urlencoded"; Request = New HTTPRequest("/api/order_items/93076?order_item=30", Hlavičky); Request.SetBodyFromString("",TextEncoding.UTF8, UseByteOrderMark.NotUse); Connection.Write(Požadavek);

A pravděpodobně je zcela správné předat samotné hodnoty parametrů v těle požadavku.

Závěr je následující: platforma 1C považuje požadavek PUT bez těla za chybný a nahradí metodu HEAD.

Je zvláštní, že 1C nesleduje požadavek POST bez těla a neproměňuje ho v GET, zkontroloval jsem to pro zábavu.

Jak by řekl známý Vovochka ze slavného vtipu: "Kde je logika?"

Doufám, že moje publikace někomu ušetří několik hodin života při hledání odpovědi. =)))

Na platformě 1C Enterprise 8.3 bylo možné vytvářet služby HTTP

Pomocí vestavěného jazyka nyní můžete generovat odpověď na požadavek. Zároveň máte jednoduchý přístup do těla, záhlaví a zdrojového řádku žádost a je také možné generovat kód, tělo a záhlaví Odpovědět dle vlastního uvážení.

Ve srovnání s webovými službami dostupnými na platformě SOAP mají služby HTTP řadu výhod:

  • Snadné programování klienta takových služeb;
  • Potenciálně méně přenesených dat;
  • Potenciálně nižší výpočetní zátěž;
  • HTTP služby jsou „zdrojově“ orientované SOAP služby"akčně orientované.

Databáze demonstruje implementaci http služeb

http-service Seznam faktur

Služba http používá šablony URL a implementuje zpracování vlastností ParametryURL objekt HTTPServiceRequest
V v tomto příkladu ukazuje, jak můžete vytvořit distanční základnu mezi pracovní základnou a firemním webem
Probíhá připojení k demo databázi “ Řízení obchodu 11“, ve kterém nejprve pro adresář „Protistrany“ musíte nastavit další vlastnost s názvem Webové heslo , kde uložíme přístupové heslo.
Na požadavek http budou odeslány následující parametry URL: TIN jako přihlašovací jméno a heslo.
Při zpracování požadavku je provedeno spojení přes ComConnector s UT (brzdy jsou zaručeny) a odtud se provádí vzorkování
Nepředstírám, že je toto řešení rychlé nebo bezpečné, je to jen příklad

Tak. Ve stromu metadat se objevila nová větev – služby HTTP
Vytvořte novou službu, zadejte její název a kořenovou adresu URL (seznam)
Kořenová adresa URL bude použita k volání naší služby http
Dále přidejte šablonu URL do služby http a jako šablonu zadejte „/(Přihlášení)/(Heslo).
Tato šablona vám umožní získat odpovídající strukturu parametrů a jejich hodnot v parametrech URL při zpracování požadavku http.
Nyní do naší šablony URL přidáme metodu nazvanou „get“, jako metodu http vyberte GET
Otevřete handler a napište kód
Obslužná rutina metody je funkce, která musí vracet hodnotu typu HTTPServiceResponse

Stav objednávky služby http

Příklad implementuje zpracování předávaných proměnných Metoda POST, generující odpověď ve formě HTML stránky.
Data jsou tentokrát vzorkována z databáze, kde se nachází hs, takže funguje výrazně rychleji než předchozí http služba.
Při implementaci fungujícího systému má smysl vytvářet objekty v databázi (se službou) a konfigurovat migraci dat ze zdrojové databáze (například samostatným procesem na pozadí). Při zpracování http požadavku se vzorkování provádí přímo z databáze, kde se nachází.

Vydání

Existuje spousta informací o instalaci a konfiguraci webového serveru.
Použil jsem sestavení httpd-2.2.25-win32-x86-openssl-0.9.8y.exe odtud
Instalováno metodou „Další-Další-Dokončit“ :)
Zveřejnění http služeb se nachází na stejném místě, kde bylo a je a není zveřejnění webových služeb nijak zvlášť odlišné.
Po instalaci webového serveru v režimu „Konfigurátor“ přejděte do nabídky „Administrace“ – „Publikování na webovém serveru“
Na záložce „Služby HTTP“ nastavte název publikace, webový server, adresář publikací a označte naše služby (v mém případě je název „web“, webový server Apache 2.2)
Při publikování jsou příslušné bloky automaticky zapsány do konfiguračního souboru httpd.conf a server je restartován (při prvním publikování)
Volání služby http
Příklad: http://mysite/web/hs/list, Kde
moje stránka– adresa serveru (pokud je webový server nainstalován lokálně, můžete použít 127.0.0.1)
web– jméno zadané při zveřejnění (alias)
hs– povinný segment cesty, který serveru říká, že bude fungovat se službami http
seznam– kořenová adresa URL webové služby

Testování

Seznam faktur

http://127.0.0.1/web/hs/list/7705260681/pswMP (Nezapomeňte nastavit další vlastnost v UT pro heslo)

Předpokládá se, že pro přístup do registru dokumentů uživatel používá přímý odkaz obsahující INN a heslo

Stav objednávky

http://127.0.0.1/web/hs/check

Požadavek a odpověď jsou umístěny na stejné adrese URL. Při vstupu na stránku se spustí metoda GET, která vrátí html formulář

Po kliknutí na „Zkontrolovat“ se číslo objednávky odešle metodou POST na stejnou URL, odpověď se vrátí se stejným poptávkovým formulářem doplněným o údaje o požadované objednávce.

V přiloženém souboru je stažení databáze pro 1C 8.3. Konfigurace obsahuje 2 http služby (z publikace), nastavení komunikačního spojení s demo databází UT 11 a dokument „Objednávka“.

Co je potřeba pro spuštění a testování

  • webový server
  • jakýkoli webový prohlížeč
  • aktuální vydání1C: Enterprise 8.3

Počínaje druhou verzí platformy 8 mají uživatelé a vývojáři možnost používat požadavek http přímo v 1C. Program podporuje dva typy požadavků:

  • požadavky POST;
  • požadavky GET.

Vznikl tak celkem pohodlný nástroj pro výměnu dat a interakci s webovými službami a službami běžícími přes http.

požadavek GET

Nejjednodušší příklady použití dotazů samozřejmě ilustrují jejich možnosti mnohem lépe než mnoho řádků popisu. Tak zkusme:

  1. Pojďme získat tělo hlavní stránky našeho webu;
  2. Budeme pracovat na přesměrování požadavku;
  3. Vezměme si obrázek z webu.

Získání těla webu

Začněme něčím jednoduchým. Na Obr.

Výsledkem provádění této části kódu je poměrně rozsáhlý text, jehož závěrečná část je na obr. 2.

Obr.2

V prvním řádku kódu vytvoříme objekt připojení k prostředku http. Objekt může obsahovat následující vlastnosti:

  • Server - připojovací řetězec obsahující adresu serveru;
  • Port – standardně obsahuje číslo označující port serveru, v závislosti na typu připojení můžete zadat 80 pro nezabezpečená připojení nebo 443 pro zabezpečená SSL.
  • Uživatelské jméno – uvádí se, pokud je vyžadována autorizace na serveru;
  • Heslo – heslo uživatele na zadaném zdroji;
  • Proxy – může obsahovat objekt typu InternetProxy, indikovaný při použití proxy pro komunikaci se serverem;
  • Zabezpečené připojení – výchozí hodnota je FALSE, přepnutí na TRUE znamená použití protokolu https.

Kromě toho má objekt HTTPConnection své vlastní metody, jejichž volání vám umožňuje úplněji popsat algoritmus provádění handleru:

  • CallHTTPmethod – obsahuje dva požadované parametry, HTTPmethod a HTTPrequest, podporuje možnost zapsat tělo odpovědi do souboru specifikovaného ve třetím parametru;
  • Write – pomocí požadavku PUT odešle data na server;
  • Modify – modifikuje objekt zpracováním požadavků PATCH;
  • SendForProcessing – metoda indikující použití požadavku POST, stejně jako všechny předchozí metody, musí obsahovat text požadavku a může také přenášet adresu souboru odpovědí pro záznam dat;
  • Příjem - to bude podrobněji probráno níže;
  • GetHeadings je další metoda, která bude v článku použita;
  • Odstranit je ve skutečnosti požadavek na odstranění, který odstraní zdroj předaný v požadavku ze serveru.

Ve druhém řádku vytvoříme požadavek na vybraný web, text našeho požadavku obsahuje jedno lomítko, což znamená, že chceme obdržet domovská stránka. Pokud by za lomítkem následoval jakýkoli výraz, například „stránka2“ nebo „novinky“, dostali bychom jinou stránku.

Třetí řádek provede náš požadavek na server.

Ve čtvrtém ukazujeme výsledek.

Zpracování přesměrování požadavku http

Představme si situaci, kdy potřebujeme programově získat výsledek hledání přes libovolný vyhledávač tlačítkem „Požadavky za 1s“. Část kódu potřebná pro přístup do GOOGLE je znázorněna na obr. 3

Obr.3

Zde jsou kromě nám již známých struktur hlavičky a stavový kód. Pojďme se s nimi vypořádat.

Stavový kód – standardní hodnota uvedená v „Žádosti o komentáře“, může nabývat následujících hodnot:

  1. Pokud je vše v pořádku, hodnota se vrátí v rozsahu od 100 do 299;
  2. V případě přesměrování bude vrácen kód v rozsahu od 300 do 399 v našem případě bude úspěšné trvalé přesměrování na zdroj určeno kódem 301;
  3. Pokud jsou v požadavku chyby, parametr bude mít hodnotu od 400 do 499;
  4. Hodnota v rozsahu 500-599 označuje problémy se serverem.

Každá stránka má titulek, v jehož textu lze rozlišit několik parametrů (obr. 4):

  1. Schéma zapojení (vše, co je před dvěma lomítky „//“);
  2. Řádek s adresou připojení;
  3. Uživatelské jméno a heslo;
  4. Port a hostitel, ke kterému se chcete připojit.

Právě toto rozdělení provádí funkce SplitAddressLine. Po obdržení nové adresy si můžeme stránku uložit na svůj počítač a otevřít ji ve výchozím prohlížeči (postup GetPage).

Obr.5

Nejsou zde žádné nové funkce ani způsoby práce s požadavky, my vlastně tvoříme Textový dokument z těla webu a spusťte stránku v prohlížeči.

Soubor umístíme do kořenového adresáře jednotky D a nazveme jej test.

Obrázek bereme z webu

Nabízí se přirozená otázka: pokud nepotřebujeme celý web, ale potřebujeme získat pouze jeho jednotlivé prvky, lze to udělat a jak? Ano můžeš. Programový kód, který vám to umožňuje, je uveden na obr. 6

Obr.6

Jak můžete vidět z obrázku, v těle požadavku máme kód prvku struktury webu, který potřebujeme obdržet. Tato část nebyla v našem předchozím popisu a musíme se u tohoto bodu zastavit podrobněji.

Použili jsme prohlížeč Opera pro přístup na stránky. Má pro nás jeden důležitý nástroj, když kliknete pravým tlačítkem na prvek, můžete zavolat kontextová nabídka, jednou z položek je „Zobrazit kód prvku“.

Právě díky němu můžeme získat adresu, která bude použita v požadavku obr. 7.

POST požadavek

Na rozdíl od jednoduchých požadavků Get mají POST http požadavky textové tělo, které lze uložit buď ve formě prostého textu, nebo ve formě souborů s příponou xml, soap, json. Nástrojů pro tvorbu textů požadavků, které umožňují ladit a sledovat provádění určitých požadavků, je na síti poměrně hodně.

V 1C má objekt požadavku HTTP za účelem spuštění požadavku se specifickým textem proceduru SetBodyFromString.