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

Kniha o tvorbě a konzumaci WS zdarma

07.33 - 23. dubna 2006 | Webové služby

Tento článeček je jen odkazovací, moc vlastní invence nepřináší, ale i tak je poměrně zajímavý. Teda pokud vás, stejně jako mě, zajímá problematika webových služeb – pro některé jedna z webových bublin. Nakladatelsví Apress vydalo knihu Google, Amazon, and Beyond: Creating and Consuming Web Services. Ke stažení (2.1 MiB, PDF)

Autor: Aleš Roubíček | Zatím bez komentáře | del.icio.us | Linkuj!

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 | 13x komentováno | del.icio.us | Linkuj!

Now Playing na stránkách

20.32 - 1. června 2005 | Webové služby

Dnes jsem přidal další box do pravého panelu. Jmenuje se Právě poslouchám a zobrazuje aktuální přehrávanou písničku nebo video v mém počítači. Funguje to díky plug-inu SongWriter pro Windows Media Player 9 a novější, ten uploaduje přes FTP XML s požadovanými informacemi, a vlastnímu controlu pro výpis těchto informací.

Jak na to

Nejprve je nutné si nainstalovat plugin SongWriter a nastavit si co a kam se má generovat. Okno s nastavením na vás vyskočí po instalaci pluginu a zapnutí Media Playeru. Pokud by nevyskočilo najdete ho v menu Možnosti \ Nastavení \ Moduly Plug-in, Kategorie: Pozadí, SongWriter Plugin, Vlastnosti. Tady si navolíte vlastnosti, které chcete zobrazit, zvolíte formát XML a nastavíte vlastnosti FTP připojení (cesta nesmí končit lomítkem).

Zkuzte, jestli je vše správně nakonfigurováno, nejlépe testem přímo na serveru, soubor se jmenuje songout.xml. Pro ty, co jsou ve zpracování XML, zde článek končí, neboť si data zpracují sami :) Ostatní nechť směle pokračují ve čtení.

Nyní přistoupíme k tvorbě controlu. Předem upozorňuju, že je napsanej v ASP.NET 2 (beta 2), takže nemusí a ani nebude fungovat ve starších verzích.

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.IO;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;

public partial class NowPlaying : System.Web.UI.UserControl
{
  public string Src
  {
    set
    {
      ViewState["nowplayingsrc"] = value;
    }
    get
    {
      return ViewState["nowplayingsrc"].ToString();
    }
  }

  protected void Page_Load(object sender, EventArgs e)
  {
    NactiData();
  }

  protected void NactiData()
  {
    string path = Server.MapPath(Src);
    XmlDocument doc = new XmlDocument();
    doc.Load(path);

    XmlNodeList media = doc.GetElementsByTagName("media");
    XmlNode posledni = media[0];
    XmlNode autor = posledni.SelectSingleNode("artist");
    XmlNode pisen = posledni.SelectSingleNode("title");
    XmlNode album = posledni.SelectSingleNode("album");

    if (autor != null) {
      if (autor.InnerText.ToLower() == "stopped") {
        NowPlayingOut.Text = "<p>Zrovna nic.</p>";
      } else {
        if ((pisen != null) && (album != null))
          NowPlayingOut.Text = String.Format("<dl><dt>Autor</dt><dd>{0}</dd><dt>Píseň</dt><dd>{1}</dd><dt>Album</dt><dd>{2}</dd></dl>", autor.InnerText, pisen.InnerText, album.InnerText);
        else if ((pisen != null))
          NowPlayingOut.Text = String.Format("<dl><dt>Autor</dt><dd>{0}</dd><dt>Píseň</dt><dd>{1}</dd></dl>", autor.InnerText, pisen.InnerText);
      }
    } else {
      if ((pisen != null))
        NowPlayingOut.Text = String.Format("<p>{0}</p>", pisen.InnerText.Replace('_',' '));
    }
  }
}

No a teď prezentační část.

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="NowPlaying.ascx.cs" Inherits="NowPlaying">
<div class="box nowplaying">
<h2>Právě poslouchám</h2>
<asp:Literal ID="NowPlayingOut" runat="server"></asp:Literal>
</div>

Přeju hodně zábavy.

Autor: Aleš Roubíček | Zatím bez komentáře | del.icio.us | Linkuj!

Služba Svátky

10.27 - 28. dubna 2005 | Webové služby

Vytvořil jsem jednoduchou webovou službu, která vrací jména z kalendáře. Má dvě metody:

  1. Dnesni – vrací aktuální svátek k dnešnímu dni
  2. PodleData – vrací svátek k datumu předávaného parametrem datum

Jak vidíte jde o velice jednoduchou službu, která se dotazuje do databáze svátků. I přes její jednoduchost jsem narazil na zajímavou věc, o které jsem dosud netušil, a to, že pokud službu zavoláte pomocí protokolu HTTP-GET nebo HTTP-POST, tak dojde k chybě, místo vrácení výsledku. Po hodině hledání jsem přišel na to, že ASP.NET 1.1 a novější maj tyto protokoly pro WS defaultně zablokované. Řešení je ale jednoduché, stačí upravit soubor web.config a vše by mělo fungovat, jak má.

<configuration>
  <system.web>

    <!-- povolení protokolů GET a POST pro WS -->
    <webservices>
      <protocols>
        <add name="HttpGet" />
        <add name="HttpPost" />
      </protocols>
    </webservices>

  </system.web>
</configuration>

Autor: Aleš Roubíček | 3x komentováno | del.icio.us | Linkuj!