Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

Texy! Web Service (WS)

18.40 - 2. srpna 2005 | Webové služby

Již dlouhou dobu používám Texy! v několika webových projektech, které používají redakční systém TextPattern. Na syntax Texy! jsem si zvykl a líbí se mi, jak jednoduše dostanu XHTML validní kód. Už v začátku jsem chtěl přepsat Texy! do dotnetu, abych ho mohl použít i v mém redakčním systému Gryphoon. Jenže Texy! má velice rozsáhlé zdrojové kódy a tak se mi do toho moc nechtělo, i když by to byla velice zajímavá zkušenost. Jednoho krásného dne mě však napadlo, že by bylo docela zajímavé udělat z Texy! webovou službu, ke které může přistupovat v podstatě kdokoliv.

Nakonec jsem se rozhodl službu napsat sám a něco se přiučit v PHP (né že by to byla moje priorita, ale každá zkušenost dobrá). Zjistil jsem, že PHP 4.x nemá podporu pro SOAP volání, tak jsem našel knihovnu nuSOAP. Knihovna nuSOAP je univerzální knihovnou jak pro WS klienty, tak pro WS servery. Jedinou podivností této knihovny je, že z nějakého zvláštního důvodu převádí UTF-8 na ISO-8859–1 a pak zpět, čímž dojde ke ztrátě znaků s diakritikou.

Takže je potřeba v této knihovně udělat několik změn, aby správně fungovala čeština. Nejprve je nutné upravit funkci character_data ve třídě soap_parser. Následující kód prostě zakomentujte:

if($this->decode_utf8) {
  $data = utf8_decode($data);
}

Dále je potřeba nastavit kódování odchozí zprávy na UTF-8, to se dělá v deklaracích třídy nusoap_base, řádek

var $soap_defencoding = 'ISO-8859-1';

Změňte na:

var $soap_defencoding = 'UTF-8';

Tím by měly být problémy se ztrátou českých znaků vyřešeny. Další nutnou knihovnou je samotná knihovna Texy!. No a nyní se dostáváme k tomu nejdůležitějšímu – službě samotné.

<?php

/*  Texy Web Service
 *  ================
 *
 *  Provides SOAP interface for Texy! syntax convertor.
 *  Author: Aleš Roubíček -rarous- (rarous@seznam.cz)
 *
 */

require_once("texy-compact.php");  // knihovna Texy!
require_once("nusoap.php"); // knihovna nuSOAP

$ns = "http://texy.info"; // prostor názvů služby

$server = new soap_server();
$server->configureWSDL('TexyConverter', $ns); // název webové služby
$server->wsdl->schemaTargetNamespace = $ns;

// zveřejnění metody s jejími parametry
$server->register(
  'PrevedDoXhtml',
  array('text' => 'xsd:string'),
  array('return' => 'xsd:string'),
  $ns
);

$server->register(
  'PrevedDoXhtmlR',
  array('text' => 'xsd:string',
    'utf' => 'xsd:boolean',
    'trust' => 'xsd:boolean',
    'headingLevel' => 'xsd:integer'
  ),
  array('return' => 'xsd:string'),
  $ns
);

// funkce pro základní formátování s natvrdo nastavenými vlastnostmi
// input string text – text v Texy! syntaxu
// return string html – vrací XHTML kód
function PrevedDoXhtml($text) {
  $texy = &new Texy();
  $texy->utf = true;
  $texy->trustMode();
  $texy->headingModule->top = 3;
  $html = $texy->process($text);
  return $html;
}

// funkce pro základní formátování s volitelnými vlastnostmi
// input string text – text v Texy! syntaxi
// input boolean utf – má Texy! pracovat s UTF?
// input boolean trust – má Texy! pracovat v důvěryhodném režimu nebo v bezpečném
// input integer headingLevel – nejvyšší úroveň nadpisu
// return string html – vrací XHTML kód
function PrevedDoXhtmlR($text, $utf, $trust, $headingLevel) {
  $texy = &new Texy();
  $texy->utf = $utf;
  if($trust) $texy->trustMode();
  else $texy->safeMode();
  $texy->headingModule->top = $headingLevel;
  $html = $texy->process($text);
  return $html;
}

$server->service($HTTP_RAW_POST_DATA);

?>

Toť vše drazí čtenáři. Vlastně ještě ne, tohle je první příspěvek na tomhle blogu, který je formátován pomocí Texy!

Autor: Aleš Roubíček | Web feed s komentáři | Přidej komentář | del.icio.us | Linkuj!

Komentáře

  1.  

    lukas

    19.34 - 26. prosince 2005 | #

    Díky, díky, díky za ten návod jak rozchodit v nusoap.php češtinu!

  2.  

    David Grudl

    18.02 - 19. dubna 2006 | #

    Lze z ASP (.NET) pohodlně používat i webovou službu napsanou v XML RPC?

  3.  

    Aleš Roubíček

    07.49 - 20. dubna 2006 | #

    XML RPC neni stadard pro webové služby, SOAP je implementací XML RPC a je doporučován W3C jako standard pro komunikaci webových služeb. Co se týče pohodlnosti – na RPC musíš přidat do projektu knihovnu třetí strany navíc, nebo si napsat něco vlastního. U WS to netřeba, .net má nativní podporu.

  4.  

    DeaLer

    13.52 - 20. dubna 2006 | #

    Nebyl by někde ke stažení příklad s použitím této webové služby v .NETu?

  5.  

    Aleš Roubíček

    17.15 - 20. dubna 2006 | #

    V ASP.NET 2.0 stačí přidat do projektu referenci na službu (URL) a to je vše, pak už pracujete se třídou. Přesněji se do adresáře App_WebReference uloží soubor WSDL, který službu popisuje, a ve web.configu se sváže s URL služby. Kompilátor se o vše ostatní postará.

  6.  

    DeaLer

    17.23 - 20. dubna 2006 | #

    Díky. Jakou URL mám přidat do referencí? Musí ta Webová Služba běžet na stejném serveru jako můj web, nebo je někde hostovaná?

  7.  

    Aleš Roubíček

    19.19 - 20. dubna 2006 | #

    někde si tuhle službu musíš nahostovat, já ji třeba mám na WZ, proto ti nedám její adresu – nezvládla by takovou zátěž. Nasazení služby je záležitost chvilky, pak do projektu přidáš referenci na WSDL té služby, např. http://neco.wz.cz/ws/texyservice.php?wsdl a o vše ostatní se postará Studio (WebDeveloper), ve wizardu si nastavíš namespace, přes kterej budeš přistupovat k proxy třídě. další možností je nové řešení pomocí XML RPC.

  8.  

    DeaLer

    19.30 - 20. dubna 2006 | #

    Díky. Nebude s tím problém. Hostuju na www.qsh.sk a tam je podpora PHP i ASP.NET 2.0.

  9.  

    DeaLer

    19.39 - 20. dubna 2006 | #

    Přeci jen ještě jeden v nedůležitej dotaz. Nevíš čistě náhdou jak podobnou službu vytvořit v PHP 5.5 (obsahuje podporu volání SOAP)? Na řešení s XML RPC jsem koukal – má oproti této WS nějaké zásadní omezení?

  10.  

    Aleš Roubíček

    06.59 - 21. dubna 2006 | #

    [9] DeaLer Vím o tom, že PHP 5 SOAP konečně podporuje, ale v PHP primárně nepíšu, takže řešení neznám (ani jsem ho nepotřeboval – nemám hosting s PHP 5). Co se týče RPC, asi tam veliké rozdíly nebudou, snad jen v zátěži DGXova serveru :) Pokud použiješ SOAP bridge (přímo tu WS), tak tu bude asi trošku delší odezva, díky dvoum vzdáleným voláním.

  11.  

    DeaLer

    08.19 - 21. dubna 2006 | #

    Díky. Kdyžtak mejlem pošlu přepsanej kód pro PHP 5.

  12.  

    David Grudl

    08.12 - 25. dubna 2006 | #

    Takže je potřeba v této knihovně udělat několik změn, aby správně fungovala čeština.… Následující kód prostě zakomentujte:

    Ve skutečnosti stačí nakonfigurovat klienta:

    $client->soap_defencoding = 'UTF-8';
    $client->decode_utf8 = false;
  13.  

    NeLSoN

    10.57 - 13. listopadu 2006 | #

    [12] dgx Diky za radu !

Místo pro tvůj názor

Povinné je jméno a komentář, z e-mailu se rozpoznají Gravatary.
Komentář je formátován pomocí Texy! syntaxu.
Například: **tučný text**, *kurzíva*, "text odkazu":adresa.
Internetové adresy jsou převáděny na odkazy.
Na komentáře se můžete odkazovat pomocí [číslo komentáře].

Nový komentář