Hlavní navigace

Jabber - komunikačný protokol (7)

Peter Sivák

V siedmej časti seriálu budeme opisovať výmenu formulárov medzi používateľmi a aplikáciami v Jabbere. Formuláre môžu slúžiť na vytvorenie jednoduchého používateľského rozhrania na komunikáciu s roBotmi.

Predstavme si takýto scenár: používateľ našiel chybu v programe, ktorý používa, a chce ju oznámiť programátorom, ktorí ho vyvíjajú. Prihlási sa do diskusnej miestnosti venovanej danému programu a medzi účastníkmi vyhľadá roBota, ktorý je určený na ohlasovanie chýb v programe. Tento roBot mu poskytne formulár, ktorý používateľ vyplní a odošle späť.

Aj keď spomínaného roBota ešte zrejme nikto nenaprogramoval, technológie na to nevyhnutné sú k dispozícii. Všetko potrebné sme už v seriáli opisovali – až na posielanie formulárov. Pri vytváraní miestností v Multi User Chat protokole sme spomínali, že výmena formulárov prebieha pomocou protokolu Data Forms (JEP-04). A práve o ňom si povieme viac v tejto časti.

Data Forms

Formuláre obsahujú štruktúrované dáta, ktoré sa vymieňajú medzi používateľom a aplikáciou. V samotnom Jabbere sa formuláre používajú napr. pri registrovaní transportu. Kým ICQ transportu stačí zadanie UIN a hesla, MSN transport vyžaduje ešte aj meno používateľa. Protokol Data Forms umožňuje, aby požadované údaje nemuseli byť natvrdo definované v protokole, ale boli vyžiadané ad hoc. Data Forms by mal byť podľa tvorcov akýsi kompromis medzi jednoduchými dvojicami meno-hodnota a komplexným protokolom XForms.

Formulár môže byť prenášaný v Message, IQ aj v Presence paketoch. Je reprezentovaný XML elementom <x/> v mennom priestore jabber:x:data. Element <x/> má atribút „type“, ktorého hodnota je jedna z týchto:

  • form – roBot posiela prazdny formulár na vyplnenie
  • submit – používateľ vracia vyplnený formulár späť
  • cancel – používateľ stlačil cancel
  • result – roBot vracia nejaké údaje po spracovaní, napr. výsledky vyhľadávania.

Element <x/> obsahuje elementy

  • title – názov formulára
  • instruction – inštrukcie (text), ako vyplniť formulár

a niekoľko elementov <field/> s jednotlivými položkami formulára.

Príklad pre nevyplnený formulár odoslaný v IQ pakete:

<iq from='BugReportBot@program.jabber.org'
  to='psivak@jabber.sk'
  type='result'
  id='1'>
  <x xmlns='jabber:x:data' type='form'>
    <title>Bug Report</title>
    <instructions>Vyplňte tieto údaje:</instructions>
    <field type='text-single'
      label='Názov programu'
        var='programname'/>
    <field type='text-multi'
      label='Popis chyby'
        var='description'/>
    <field type='list-single'
      label='Verzia'
        var='version'>
      <option label='0.9'><value>0.9</value></option>
      <option label='1.0'><value>1.0</value></option>
      <option label='2.0'><value>2.0</value></option>
    </field>
  </x>
</iq> 

Typy položiek sú

  • boolean pre logické hodnoty
  • fixed pre popisný text
  • hidden pre neviditelné položky, ktoré sa vrátia spolu s formulárom
  • jid-single pre zoznam Jabber IDov (vyberá sa jeden)
  • jid-multi pre zoznam Jabber IDov (môže sa vybrať viac)
  • list-single pre zoznam (vyberá sa jedna položka)
  • list-multi pre zoznam (môže sa vybrať viac položiek)
  • test-single pre jednoriadkový text
  • text-multi pre viacriadkový text
  • text-private pre zadávanie hesiel

Formulár sa vyplní pridaním elementov <value/> do jednotlivých elementov <field/>.

Formuláre v Smacku

Smack implemetuje formuláre v triede Form. Konštruktorom vytvoríme nový formulár:

Form myForm = new Form(Form.TYPE_FORM); 

Vo vytvorenom formulári vyplníme názov a inštrukcie:

myForm.setTitle("Bug Report");
myForm.setInstructions("Vyplňte tieto údaje:"); 

Pokračujeme vytváraním položiek a ich pridávaním do formulára:

field = new FormField("programname");
field.setType(FormField.TYPE_TEXT_SINGLE);
field.setLabel("Názov programu");
myForm.addField(field);

field = new FormField("description");
field.setType(FormField.TYPE_TEXT_MULTI);
field.setLabel("Popis chyby");
myForm.addField(field); 

A nakoniec vytvorený formulár odošleme v Message pakete:

Message msg = chat.createMessage();
msg.addExtension(formToSend.getDataFormToSend());
chat.sendMessage(msg);

Vyplnenie položky:

myForm.setAnswer("programname", "jabberd"); 

Záver

Formuláre protokolu Data Forms spolu s messagingovými funkciami XMPP umožňujú vytvárať online služby s jednoduchým používateľským rozhraním. Komunikácia s roBotmi tak nie je obmedzená len na posielanie textových správ.

Našli jste v článku chybu?