WEB-PALVELUITA HYÖDYNTÄVÄN WINDOWS PHONE 7 -SOVELLUKSEN RAKENTAMINEN



Samankaltaiset tiedostot
Järjestelmäarkkitehtuuri (TK081702)

REST rajapintana mobiilikehityksessä

C# Windows ohjelmointi perusopas

AJAX-konsepti AJAX. Asynkronisuus. Nykyisten web-ohjelmien ongelmia. Asynchronous JavaScript And XML

Järjestelmäarkkitehtuuri (TK081702) Avoimet web-rajapinnat

2010-luvun kansalaistaito: Windows-puhelimen ohjelmointi. Kai Lindgren, Teollinen tuotanto/metropolia

JWT 2016 luento 11. to klo Aulikki Hyrskykari. PinniB Aulikki Hyrskykari

Tiedonsiirto- ja rajapintastandardit

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

in condition monitoring

HSMT J2EE & EJB & SOAP &...

HOJ J2EE & EJB & SOAP &...

Trimble Feedback Mobile app ja rajapinnat Kuvaus

Web Services tietokantaohjelmoinnin perusteet

Järjestelmäarkkitehtuuri (TK081702) Web Services. Web Services

Web Service torilla tavataan!

Olio-ohjelmointi Javalla

Windows Phone 7.5 erilainen ja fiksu älypuhelin. Vesa-Matti Paananen Liiketoimintajohtaja, Windows Phone Microsoft Oy

Taustaa. CGI-ohjelmointi

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

812336A C++ -kielen perusteet,

BDD (behavior-driven development) suunnittelumenetelmän käyttö open source projektissa, case: SpecFlow/.NET.

Citizen s skill in 2010s: Programming the Windowsphone. Kai Lindgren, Industrial Production/Metropolia

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Microsoft Visual Studio 2005

PLA Mobiiliohjelmointi. Mika Saari

Järjestelmäarkkitehtuuri (TK081702) SOA, Service-oriented architecture SOA,

Alkuraportti. LAPPEENRANNAN TEKNILLINEN YLIOPISTO TIETOJENKÄSITTELYN LAITOS CT10A Kandidaatintyö ja seminaari

Android ohjelmointi. Mobiiliohjelmointi 2-3T5245

Omat Lähdöt ohjelmointirajapinta: Versio 1.01

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

TIEKE Verkottaja Service Tools for electronic data interchange utilizers. Heikki Laaksamo

Visma Software Oy

Kieliversiointityökalu Java-ohjelmistoon. Ohje

KYMENLAAKSON AMMATTIKORKEAKOULU Tietotekniikan koulutusohjelma / Tietoverkkotekniikka. Joni Korjala APACHE WWW-PALVELIN Seminaarityö 2012

Toimintaympäristön kuvaus. LTC-Otso Myyjän työkalu (POC)

PLA Mobiiliohjelmointi. Mika Saari

T Hypermediadokumentin laatiminen. Sisältö. Tavoitteet. Mitä on www-ohjelmointi? Arkkitehtuuri (yleisesti) Interaktiivisuuden keinot

PUSH palvelut mobiilikehityksessä: Android ja Windows phone 7. Pauli Kettunen

REST an idealistic model or a realistic solution?

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?


Tekninen suunnitelma - StatbeatMOBILE

Visma Nova Webservice Versio 1.1 /

Tekninen suunnitelma - StatbeatMOBILE

Windows Phone. Module Descriptions. Opiframe Oy puh Espoo

Varmennepalvelu - testipenkki. Kansallisen tulorekisterin perustamishanke

7.4 Variability management

Pilottipalvelun esittely johtopäätökset

Tech Conference Visual Studio 2015, C#6,.NET4.6. Heikki Raatikainen. #TechConfFI

ELM GROUP 04. Teemu Laakso Henrik Talarmo

MOBISITE-TYÖKALUN SISÄLTÄMÄT TOIMINNOT

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Järjestelmäarkkitehtuuri (TK081702) Järjestelmäarkkitehtuuri. Järjestelmäarkkitehtuuri

.NET ajoympäristö. Juha Järvensivu 2007

Käytettäväksi QR-koodin lukulaitteen/lukijan kanssa yhteensopivien sovellusten kanssa

FinFamily PostgreSQL installation ( ) FinFamily PostgreSQL

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

GPRS-lisäpalvelu INTERNET-ASETUKSET

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

5 Näppäimistö. 5.1 Näppäimistön eventit

Mikä yhteyssuhde on?

SUOMEN KUNTALIITTO RY

DIPLOMITYÖ ARI KORHONEN

Action Request System

Käyttöohje Planeetta Internet Oy

Pedacode Pikaopas. Web-sovelluksen luominen

Paikkatietorajapinnat IT arkkitehtuurin näkökulmasta

10 Nykyaikainen WWW-arkkitehtuuri

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

SOA SIG SOA Tuotetoimittajan näkökulma

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

.NET 2006 ja sen jälkeen

18. Abstraktit tietotyypit 18.1

ASP.NET Web API 2:ta hyödyntävä Angular 4 -sovellus

Projektinhallintaa paikkatiedon avulla

FinFamily Installation and importing data ( ) FinFamily Asennus / Installation

Alkuraportti. LAPPEENRANNAN TEKNILLINEN YLIOPISTO TIETOJENKÄSITTELYN LAITOS Ti Kandidaatintyö ja seminaari

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Object Framework - One. OF-1 is a high-productive Multi-UI OpenEdge data driven development framework. Veli-Matti Korhonen

VisualStudio Pikaopas, osa 1: WEB sivujen suunnittelu

Julkaisun laji Opinnäytetyö. Sivumäärä 43

Apuja ohjelmointiin» Yleisiä virheitä

Pedacode Pikaopas. Web Service asiakasohjelman luominen

The OWL-S are not what they seem

Web-palveluiden alusta Axis2

Security server v6 installation requirements

Suuli api dokumentaatio

ETÄPALVELU. HALTIK Videoportaali - osallistujan ohje

Microsoft Visual Studio 2005

ETÄTERMINAALIYHTEYS SELAIMELLA

Ohjelmoinnin jatkokurssi, kurssikoe

arvostelija OSDA ja UDDI palveluhakemistoina.

XPages käyttö ja edut Jarkko Pietikäinen toimitusjohtaja, Netwell Oy

LANSEERAUS LÄHESTYY AIKATAULU OMINAISUUDET. Sähköinen jäsenkortti. Yksinkertainen tapa lähettää viestejä jäsenille

WAMS 2010,Ylivieska Monitoring service of energy efficiency in housing Jan Nyman,

Tulevaisuuden päätelaitteet

Käyttöopas. ADAP-KOOL AK-ST 500 Oy Danfoss Ab / Kylmäosasto 1

Security server v6 installation requirements

Transkriptio:

Opinnäytetyö (AMK) Tietojenkäsittelyn koulutusohjelma Sähköisen liiketoiminnan järjestelmät 2013 Ville Skants WEB-PALVELUITA HYÖDYNTÄVÄN WINDOWS PHONE 7 -SOVELLUKSEN RAKENTAMINEN

OPINNÄYTETYÖ (AMK) TIIVISTELMÄ TURUN AMMATTIKORKEAKOULU Tietojenkäsittely Sähköisen liiketoiminnan järjestelmät Toukokuu 2013 36 + liitteet Ohjaaja: Päivi Nygren Ville Skants WEB-PALVELUITA HYÖDYNTÄVÄN WINDOWS PHONE 7 -SOVELLUKSEN RAKENTAMINEN Modernit tietojärjestelmät ovat monimutkaisia kokonaisuuksia, jotka voivat olla vuorovaikutuksessa monen muun eri järjestelmän kanssa. Web-palvelut mahdollistavat tehokkaan tavan informaation, business-logiikan ja operaatioiden siirtämiseen eri tietojärjestelmien välillä. Yhä useammin web-palveluiden tarjoamaa informaatiota käytetään älypuhelimien sovelluksissa. Microsoftin Windows Phone 7 -käyttöjärjestelmän kehitystyökalut tarjoavat hyvät toiminnot web-palveluiden käyttämiseen. Tämän opinnäytetyön tavoitteena on perehtyä yleisesti web-palveluihin ja tutkia niiden käyttöä Windows Phone 7 -sovelluksessa. Työssä tutustaan myös web-palveluita tarjoavaan rajapintaan ja käsitellään kuinka sovelluskehittäjät voivat käyttää sitä. Opinnäytetyön viimeisessä osassa luodaan yksinkertainen esimerkkisovellus edellä kuvattujen asioiden pohjalta. Esimerkkisovellus paikantaa puhelimen sijainnin, hakee sen perusteella kolme lähintä joukkoliikenteen pysäkkiä ja esittää ne käyttäjälle. Sovellus käyttää Helsingin seudun joukkoliikenteen tarjoamaa rajapintaa hakeakseen datan sovelluksen käyttöön. Sovellus ohjelmoitiin työssä esitetyllä Windows Phone 7 -sovelluskehitysympäristöllä. ASIASANAT: Windows Phone, web-palvelu, web-palvelun rajapinta

BACHELOR S THESIS ABSTRACT TURKU UNIVERSITY OF APPLIED SCIENCES Degree Programme in Business Information Technology e-business Systems May 2013 36 + liitteet Instructor: Päivi Nygren Ville Skants DESIGNING WINDOWS PHONE 7 APPLICATION USING WEB SERVICES Modern information systems are complex entities, which can communicate simultaneously with many other systems. Web services provide an efficient way to transfer information, business logic and methods between different information systems. More often nowadays web services information is consumed by applications of different phone devices. Windows Phone 7 - application development tools offer good tools for using web services. The aim of this thesis is to give a general overview of web services and study how they can be used in Windows Phone 7 -application.the thesis also discusses application programming interface which provides web services and describes how developers can use it. A sample application is created in the final section of this thesis. It is based on the above techniques. The sample application locates the current location of a phone device, uses this information to fetch three closest stops in the area and then displays them to the user. The application uses application programming interface provided by public transportation of Helsinki, in order to fetch the data. The application was developed in Windows Phone 7 -application development environment. KEYWORDS: Windows Phone, web services interface, web services

SISÄLTÖ 1 JOHDANTO 6 2 WINDOWS PHONE 7 -SOVELLUSKEHITYS 7 2.1 Windows Phonen julkaisu 7 2.2 Microsoftin.NET-arkkitehtuuri 8 2.3 Windows Phone Application Platform 8 2.4 Windows Phone 7 -sovelluksen luominen 11 3 WEB-PALVELUT 13 3.1 Mitä tarkoittaa web-palvelut? 13 3.2 Kuinka web-palvelut toimivat? 14 3.3 Web-palvelujen arkkitehtuurit 15 3.4 Vastausmuodot 16 3.4.1 XML 16 3.4.1 JSON 17 4 REITTIOPAS-RAJAPINTA 18 4.1 Projekti 18 4.2 Reittiopas API 18 4.3 Reittiopas-rajapinnan palvelut 19 4.4 Reittiopas-rajapinnan käyttö Windows Phonella 22 4.5 Projektin haasteet 24 5 ESIMERKKISOVELLUKSEN TOTEUTUS 25 5.1 Sovelluksen luominen 25 5.2 Puhelimen sijainnin selvittäminen 26 5.3 HTTP-pyyntö Reittiopas-rajapintaan 28 5.4 HTTP-vastauksen käsittely ja tulosten esittäminen 29 6 YHTEENVETO 34 LÄHTEET 35

LIITTEET Liite 1. Cycling route-moduulin request-parametrit. (Reittiopas API 2013) Liite 2. Stops in area-moduulin request-parametrit. (Reittiopas API 2013) Liite 3. Stops in area-moduulin response-kentät. (Reittiopas API 2013) Liite 4. Esimerkkisovelluksen koodi KUVAT Kuva 1.Älypuhelin Windows Phone 7 -käyttöjärjestelmällä. (Nokia.com 2013) 7 Kuva 2. Windows Phone Application Platform. (Application Platform Overview for Windows Phone 2013) 9 Kuva 3. Windows Phone 7 -sovelluksen luominen. 11 Kuva 4. Windows Phone 7 -sovelluksen tiedostot. 12 Kuva 5. Web-palvelun kuvaus. 14 Kuva 6. MainPage.xaml.cs. 25 Kuva 7. System.Device-komponentin lisääminen. 26 Kuva 8. Koordinaatit parametreja varten. 28 Kuva 9. Pysäkki-informaation tulostus. 33 TAULUKOT Taulukko 1. Reittiopas-rajapinnan moduulit (Reittiopas API 2013). 20

6 1 JOHDANTO Web-palveluiden käyttö on tullut yhä suositummaksi vuosien myötä internetin kehittyessä. Palveluiden ja informaation jakaminen verkon kautta asiakkaille on moderni tapa luovuttaa informaatiota. Lukuisat eri yritykset hyödyntävät esimerkiksi Googlen tarjoamien kartta- ja paikkatietorajapintojen informaatiota omissa web-sovelluksissaan. Web-palveluiden tavoin mobiilisovelluksien määrä on kasvanut räjähdysmäisesti viime vuosina. Puhelimille tehdään sovelluksia monilla eri tekniikoilla. Tässä opinnäytetyössä tutustutaan Microsoftin Windows Phone sovelluskehitysympäristöön. Tämän opinnäytetyön tarkoituksena on tutkia web-palveluiden käyttöä Windows Phone 7 -sovelluskehitystyökaluilla. Ensiksi tutustutaan Windows Phone 7 - alustaan ja.net-ohjelmistokehykseen. Kolmannessa osassa käydään läpi webpalveluita ja niiden arkkitehtuuria. Neljännessä luvussa esitellään opinnäytetyössä tehtävä esimerkkisovellus, Helsingin joukkoliikenteen tarjoama Reittiopas-rajapinta ja selvitetään kuinka rajapintaa voidaan käyttää Windows Phone 7 -sovelluksissa. Opinnäytetyön viimeinen osuus on esimerkkisovelluksen toteutus. Sovellus hakee Reittiopas-rajapinnasta matkaja aikatauluinfoa sovelluksen käyttöön. Sovellus esitetään esimerkkiratkaisuna ja sitä ei tulla julkaisemaan Microsoftin Marketplace-sovelluskaupassa.

7 2 WINDOWS PHONE 7-SOVELLUSKEHITYS 2.1 Windows Phonen julkaisu Microsoft julkisti vuonna 2010 Windows Phone 7 -mobiilikäyttöjärjestelmän. Se oli seuraaja vuonna 2000 julkaistulle Windows Mobile - mobiilikäyttöjärjestelmälle, joka jäi suosiossa Androidin ja iphonen taakse. Microsoft halusi tarjota kuluttajille samanlaisen käyttäjäkokemuksen mitä Android ja iphone pystyivät tarjoamaan. Uusi käyttöjärjestelmä otettiin hyvin vastaan ja sen uskottiin olevan varteenotettava haastaja kilpakumppaneilleen. Windows Phone 7 -käyttöjärjestelmää käyttävät lukuisat eri matkapuhelinvalmistajat kuten Nokia, Samsung, HTC, LG, Dell, ZTE, Acer, Fujitsu, Toshiba ja Asus. (Lecrenski ym. 2011, 24) Kuva 1. Älypuhelin Windows Phone 7 -käyttöjärjestelmällä. (Nokia.com 2013)

8 2.2 Microsoftin.NET-arkkitehtuuri.NET-framework on Microsoftin kehittämä kehitysympäristö sovelluksien tekemiseen Windowsille, Windows Phonelle, Windows Serverille ja Windows Azurelle. Se koostuu kahdesta pääkomponentista: CLR(Common language runtime)-virtuaalikoneesta ja.net-luokkakirjastosta. CLR:n päätarkoitus on suorittaa ja hallita.net-kielillä toteutettuja sovelluksia sekä tarjota niille palveluja ja komponentteja. Näitä palveluja ovat muun muassa muistin, koodin ja poikkeusten hallinta, sekä tietoturvaan liittyvät tarkistukset. Kun ohjelman suoritus alkaa,.net:n sisäinen kääntäjä kääntää koodin CIL(Common intermediate language)-koodiksi, joka on Microsoftin kehittämä suoritinriippumaton välikieli. Sovelluksen ajon aikana, CIL-koodi käännetään käyttöjärjestelmän ymmärtämäksi konekieleksi. (Common Language Runtime 2013).NET-luokkakirjastot sisältävät luokkia, rajapintoja ja tietotyyppejä, jotka tukevat monia eri teknologioita ja helpottavat ennen kaikkea ohjelmoijan työtä. (.NETframework 4.5 2013;.NET-framework Interview Questions 2013) 2.3 Windows Phone Application Platform Windows Phone Application Platform -kokonaisuus kuuluu.netohjelmistokehykseen. Se tarjoaa kehittäjille työkalut mobiilisovellusten rakentamiseen. Se voidaan jakaa neljään osaan kuvan 2 mukaisesti: Runtimes, Tools, Cloud Services ja Portal Services.

9 Kuva 2. Windows Phone Application Platform. (Application Platform Overview for Windows Phone 2013) Runtimes sisältää Silverlight- ja XNA-ohjelmistokehykset. Kaikki Windows Phonelle tehdyt sovellukset perustuvat näihin teknologioihin. (Application Platform Overview for Windows Phone 2013) Silverlight-ohjelmistokehys antaa kehittäjille mahdollisuuden tehdä rikkaita ulkoasuja ja interaktiivisia käyttöliittymiä ja optimoida sovellukset käyttäjäystävällisiksi. Vektorigrafiikan, äänen, animaatioiden ja datan käsittely on erittäin helppoa ja tehokasta Silverlightin avulla. Silverlight-sovellukset rakennetaan XAML(Extensible Application Markup Language)-kielellä. (Petzold 2010, 2-4) XNA-ohjelmistokehys tarjoaa peleihin ja liikkuvaan kuvaan tarkotettuja komponentteja. XNA:lla voi piirtää 2D ja 3D-grafiikkaa puhelimen näytölle. XNA-tekniikalla voidaan kehittää pelejä monelle eri alustalle, joita ovat mm. Windows Phone, Windows 7 ja XBOX 360. (Petzold 2010, 2-4)

10 Windows Phone 7.5 -versiosta lähtien Silverlight ja XNA-ohjelmointikehykset voi sisällyttää samaan sovellukseen (Application Platform Overview for Windows Phone 2013). Tools-osaan kuuluvat.net-ohjelmistokehyksen kehitystyökalut. Windows Phone SDK(Software Development Kit) on paketti, joka sisältää välttämättömät ohjelmat sovellusten kehittämiseen. Paketin voi ladata osoitteesta: http://www.microsoft.com/en-us/download/details.aspx?id=27570. Se sisältää seuraavat komponentit ja ohjelmat (Download center 2013): Microsoft Visual Studio 2010 Express for Windows Phone Windows Phone Emulator Windows Phone SDK 7.1 Assemblies Silverlight 4 SDK and DRT Windows Phone SDK 7.1 Extensions for XNA Game Studio 4.0 Microsoft Expression Blend SDK for Windows Phone 7 Microsoft Expression Blend SDK for Windows Phone OS 7.1 WCF Data Services Client for Window Phone Microsoft Advertising SDK for Windows Phone. Cloud Services ovat pilvipalveluja. Nämä palvelut tarjoavat ominaisuuksia ja palveluja, jolla kehittäjät voivat hyödyntää pilvipalveluja Windows Phone - sovelluksissaan..net tarjoaa kehittäjille seuraavanlaiset pilvipalvelurajapinnat (Application Platform Overview for Windows Phone 2013): Ilmoitusrajapinnat Paikkatieto- ja karttarajapinnat Sosiaalisen median rajapinnat Mainonnan rajapinnat. Portaalipalvelut pitävät sisällään Windows Phone Marketplace -sovelluskaupan. Marketplacessa kehittäjät julkaisevat tekemiään sovelluksia. Sovellukset tarkastetaan ennen niiden julkaisua. (Application Platform Overview for Windows Phone 2013)

11 2.4 Windows Phone 7 -sovelluksen luominen Kun kehitystyökalut on asennettu, voidaan uusi Windows Phone -projekti luoda Visual Studiossa. Kehittäjän tulee valita joko Silverlight- tai XNA-sovellus kuvan 3 mukaisesti. Kuva 3. Windows Phone 7 -sovelluksen luominen. Windows Phone 7 -sovellus koostuu eri tiedostoista. Nämä tiedostot luodaan automaattisesti kun sovellus luodaan. Tiedostorakenne näkyy Solution Explorer-ikkunassa kuvan 2 mukaisesti.

12 Kuva 4. Windows Phone -sovelluksen tiedostot. Kehittäjälle tärkeimmät tiedostot ovat MainPage.xaml ja MainPage.xaml.cs. MainPage.xaml-tiedostoon luodaan sovelluksen käyttöliittymä ja se koostuu Silverlightin xaml-kielestä. MainPage.xaml.cs-tiedostoon kirjoitetaan sovelluksen business-logiikka C#-ohjelmointikielellä. (Creating a New Windows Phone Project 2013) Projektissa on myös muita tiedostoja. AppManifest.xml-tiedosto generoi sovelluksen peruskokoonpanon. AssemblyInfo.cs-tiedosto sisältää peruskokoonpanoon kuuluvaa metadataa. WMAppManifest.xml-tiedosto sisältää myös sovellukseen kuuluvaa metadataa, jota käytetään pääasiassa silloin kun sovellusta ollaan julkaisemassa Windows Phone Marketplacessa. App.xaml- ja App.xaml.cs-tiedostot sisältävät sovelluksen tietoja, kuten mistä tiedostosta sovellus käynnistetään tai mitä tiedostoja sovellus lataa käynnistyessään. (Creating a New Windows Phone Project 2013)

13 3 WEB-PALVELUT 3.1 Mitä tarkoittaa web-palvelut Web-palvelut (web services) kuuluvat SOA (Service Oriented Archtitecture)- arkkitehtuuriin. SOA-arkkitehtuurilla tarkoitetaan palvelukeskeistä arkkitehtuuria. Palvelukeskeinen arkkitehtuuri on ohjelmistotekniikassa käytetty arkkitehtuurin suunnittelutapa, jolla eri tietojärjestelmät on suunniteltu toimimaan itsenäisinä ja omina palveluina. Näitä palveluita tulisi pystyä aina käyttämään avoimien rajapintojen kautta. (Service-Oriented Architecture (SOA) and Web Services 2013) W3C eli World Wide Web Consortium on kansainvälinen yritysten ja yhteisöjen yhteenliittymä, joka ylläpitää ja kehittää WWW:n standardeja tai suosituksia. He määrittävät myös Web service-termin. Käytännössä webpalvelut ovat ohjelmistoja, jotka mahdollistavat eri sovellusten välisen vuorovaikutuksen tietoverkon yli. Web-palveluita voidaan pitää seuraavan sukupolven web-sovelluksina, moduuleina tai komponentteina, jotka tarjoavat erilaisia palveluja ja dataa verkon yli. Perinteiset HTML-sivut tarjosivat vain staattista sisältöä. Internet kehittyi ja staattinen sisältö muuttui dynaamisemmaksi muuttuvalla datalla ja rikkailla käyttöliittymillä. Web-palveluiden keksimistä voidaan pitää edistysaskeleena. Ne tarjoavat vain datan mutta ovat kaikkien asiakasohjelmien käytettävissä internetin välityksellä. Web-palveluiden paras ominaisuus on niiden yhteentoimivuus. Ne voidaan siirtää mille tahansa alustalle tai kirjoittaa millä tahansa ohjelmointikielellä. Käytännössä asiakasohjelman, kuten internet-selaimen, joka pyytää palvelua, ei tarvitse olla samalla alustalla kuin palvelu itse. Se voi myös olla eri teknologialla valmistettu palvelu. (Balani & Hathi 2009, 13-14)

14 3.2 Kuinka web-palvelut toimivat Web-palvelujen käytössä hyödynnetään yleisesti HTTP(Hypertext transfer protocol)-protokollaa. HTTP on tiedonsiirtoprotokolla, jota selaimet ja wwwpalvelimet käyttävät tiedonsiirtoon. HTTP perustuu siihen, että asiakasohjelma avaa yhteyden palvelimelle ja lähettää pyynnön resursseista GET-pyynnöllä. Palvelin vastaa pyyntöön lähettämällä halutun resurssin takaisin. Tämä resurssi voi olla käytännössä mitä tahansa, mutta tavallisemmin se on HTMLdokumentti. HTTP määrittelee lukuisia eri metodeja, joilla voidaan operoida datan kanssa. GET-metodi on yleisin metodi ja se lukee yksittäisen resurssin. Toinen käytetty metodi on POST, jolla välitetään palvelimelle muun muassa selaimessa muokattavien lomakkeiden sisällöt. Muita metodeita ovat OPTIONS, HEAD, PUT, DELETE, TRACE ja CONNECT. (Fielding ym. 1999) Seuraavassa selostetaan web-palvelujen toiminta. Asiakasohjelma tekee pyynnön haluamaansa resurssiin ja palveluntarjoaja vastaa pyyntöön lähettämällä halutun datan asiakasohjelmalle. Tavallisen esityskelpoisen HTMLdokumentin sijaan vastaus on yleensä pelkistettyä dataa, kuten XMLdokumentti, vaikkakin muita formaatteja käytetään myös. (Abeysinghe 2008, 11) Vastausformaatteja käsitellään myöhemmin tässä luvussa. Kuva 5. Web-palvelun kuvaus.

15 3.3 Web-palvelujen arkkitehtuurit Web-palvelut ja niitä tarjoavat rajapinnat jaetaan kahteen eri arkkitehtuurityyliin: SOAP ja REST. SOAP (Simple Object Access Protocol) on tietoliikenneprotokolla. SOAP viesti koostuu XML-kielellä toteutetusta pyynnöstä. Pyynnössä on oltava kirjekuori, joka määritteleen SOAP-viestin sisällön. SOAP on suunniteltu toteuttamaan etenkin metodeja ja toimenpiteitä, jotka sisältävät logiikkaa. Se tukee myös muita kuljetusprotokollia kuten SMTP ja JMS. SOAP-protokolla on käytettävissä vain XML-kielellä (Balani & Hathi 2009, 9). REST (Representational State Transfer) ei ole virallinen teknologia tai standardi. Se on enemmänkin yksinkertainen arkkitehtuurityyli toteuttaa webpalveluja. REST perustuu asiakas-palvelin vuorovaikutukseen HTTPprotokollan avulla. REST-arkkitehtuurissa on tiettyjä perusperiaatteita, joita tulee noudattaa, kun REST-rajapintaa suunnitellaan. Perusperiaatteet ovat (Abeysinghe 2008, 13; Codeproject 2011): Jokainen asia, joka voidaan nimetä, voi olla myös resurssi (esimerkiksi tiedosto, kuva). Tämä tarkoittaa käytännössä, että jokaisella resurssilla on yksilöllinen URI-osoite. REST-operaatioiden nimeäminen tulee seurata HTTP-protokollan standardimetodeita. Tämä tulee toteuttaa kuitenkin niin, että varsinaisia verbejä ei käytetä. getproducts -käsky tulisi kirjoittaa muotoon Products. REST-rajapinnan URL-osoitteet tulisi olla helposti luettavia. http://osoite.php?kategoria=tekniikka&tuote=tietokoneet tulisi olla http://osoite.php/tekniikka/tietokoneet. Resurssit voidaan esittää monella eri tavalla. Yleisimmät ovat XML ja JSON. REST-arkkitehtuuri on tilaton. Tämä tarkoittaa käytännössä, että kaikki informaatio, mikä liittyy resurssin hakuun tai muokkaamiseen, sisältyy itse HTTP-pyyntöön, eikä palvelin tallenna mitään asiakkaan pyyntöön sisältyvää tietoa.

16 Koska REST käyttää HTTP-protokollan metodeja kuten GET-metodia, on datan hakeminen REST-rajapinnasta käytännössä yhtä yksinkertaista kuin minkä tahansa sivun pyytäminen. (REST vs. SOAP The Right WebService 2013) 3.4 Vastausmuodot HTTP-pohjaisilla web-palveluilla on aina vastaus. Mikäli pyyntö voidaan suorittaa virheettömästi ja pyydetty resurssi löytyy, se palautetaan asiakasohjelman käytettäväksi. Muussa tapauksessa palautetaan HTTPtilakoodi. HTTP-protokolla määrittelee lukuisia eri tilakoodeja, mutta yleisimmät ovat 403 ja 404. Nämä tarkoittavat, että pyydettyä resurssia ei joko ole tai sen käyttö on kielletty asiakasohjelmilta. SOAP-rajapinta palauttaa aina XMLdokumentin. REST-rajapinta hyödyntää XML:n lisäksi myös JSON-kieltä. 3.4.1 XML XML (Extensible Markup Language) on W3C:n määrittämä kuvauksellinen merkintäkieli ja yleisin kieli web-palvelujen toteutukseen. XML:n tarkoituksena ei ole esittää dataa, vaan järjestellä, varastoida ja kuljettaa sitä. XML kehitettiin etenkin datan kuljettamiseen eri järjestelmien välillä. XML muistuttaa muita merkintäkieliä, kuten HTML:aa, mutta sen elementit eivät ole ennaltamäärättyjä. XML-dokumentin luoja voi itse määritellä omia elementtejä ja käyttää niitä (W3 Schools 2013). Alla on esimerkki XML-dokumentista. <?xml version="1.0" encoding="utf-8"?> <people> <person> <firstname>ville</firstname> <lastname>skants</lastname> <age>23</age> </person> <person> <firstname>matti</firstname> <lastname>esimerkki</lastname> <age>30</age> </person> <person>

17 <firstname>pekka</firstname> <lastname>esimerkki</lastname> <age>36</age> </person> </people> Esimerkissä on people-elementti, joka sisältää kolme eri person-elementtiä. Henkilö-elementillä on firstname-,lastname- ja age-elementit. 3.4.2 JSON JSON eli Javascript Object Notation on kevyt, kieliriippumaton ja tekstipohjainen tiedonsiirtomuoto. JSON käyttää Javascript-kielestä tuttua syntaksia. JSONrakenne muodostetaan käyttämällä olioita, joilla on avain/arvo-pari. JSON-olio voi sisältää merkkijonoja, olioita, taulukoita, kokonaislukuja tai boolean-arvoja (json.org 2013). JSON:n rakenne on samanlainen kuin muiden ohjelmointikielien. Useimmat ohjelmointikielet sisältävät samanlaiset tietotyypit, kuten taulukot ja oliot, joten JSON-datan käsittely on helpompaa kuin XMLrakenteiden. Alla olevassa esimerkissä näkyy hyvin JSON:n monipuolisuus. var JsonObj = "Ville":23, "Matti":30, "Pekka":36; var JsonObj2 = "JsonObject":JsonObj; var Arr_JsonObjects = ["First":1, "Second":JsonObj2]; JsonObj-olio sisältää Ville, Matti ja Pekka -muuttujat. Näiden avaimien arvoina on eri suuruisia kokonaislukuja. JsonObj2 on esimerkki siitä, kuinka arvoksi voi asettaa myös toisen olion. Arr_JsonObjects on taulukko, joka sisältää JSON-olioita.

18 4 ESIMERKKISOVELLUKSEN ESITTELY 4.1 Projekti Tässä opinnäytetyössä tehdään WP7-esimerkkisovellus, joka käyttää webpalveluita. Reittiopas API on ohjelmointirajapinta, joka tarjoaa aikataulu- ja liikenneinfoa web-palveluina Helsingin seudun joukkoliikenteestä. Rajapinta kuuluu data.suomi.fi-sivustoon, joka kerää julkisen hallinnon avoimia datoja. Sivuston tarkoituksena on edistää hallinnon avoimuutta ja jakaa julkista, verorahoin tuotettua tietoa kaikkien käyttöön. (Valtionkonttori 2013) Esimerkkisovellus hyödyntää Reittiopas-rajapinnan Stops in area-moduulin dataa kertoakseen käyttäjälle lähimmän joukkoliikennepysäkin sijainnin. Käyttäjä käynnistää sovelluksen puhelimessaan, jonka jälkeen puhelin paikantaa itsensä. Kun puhelimen sijainti on tiedossa, sovellus tekee HTTPpyynnön Reittiopas-rajapinnan Stops in area-moduuliin käyttäen puhelimen sijaintia parametrina. Käyttäjälle haetaan kolme lähintä joukkoliikenteen pysäkkiä ja kertoa, kuinka kaukana ne ovat nykyisestä sijainnista. Sovellus rakennettiin tässä työssä esitellyillä Microsoftin sovelluskehitystyökaluilla. Sovelluksen toteuttamiseen tarvittiin vain Visual Studio-kehitysalustaa ja sen tarjoamaa Windows Phone-emulaattoria.NETversio on 4.0. Koska työn painopiste ei ole ulkoasussa, ei ollut tarvetta käyttää esimerkiksi Windows Phone SDK:n mukana tulevaa Microsoft Expression Blend-ohjelmaa, jolla voi ehostaa Windows Phone-sovelluksen ulkoasua. 4.2 Reittiopas API Reittiopas API on maksuton ja sen jakamia tietoja saa käyttää ja jakaa vapaasti. Kehittäjän tarvitsee anoa rajapinnan käyttöoikeus. Rajapintaan saa tehdä

19 maksimissaan 5000 HTTP-pyyntöä tunnissa. HSL tarjoaa hyvän dokumentaation rajapinnan käyttöön. (Reittiopas API 2013) Reittiopas API on GET-rajapinta. Tämä tarkoittaa käytännössä, että asiakasohjelma voi vuorovaikuttaa rajapinnan kanssa vain GET-pyyntöjen avulla. Asiakasohjelma vain siis pyytää resurssia, eikä lähetä palvelimelle mitään. Valitsin Reittiopas-rajapinnan tähän työhön, koska se on hyvin dokumentoitu ja sitä ylläpidetään viikottain. Lisäksi se tarjoaa vastauksen tarvittaessa XML-, JSON- ja tekstimuodossa. 4.3 Reittiopas-rajapinnan palvelut Reittiopas-rajapinta tarjoaa monipuolista informaatiota Helsingin seudun joukkoliikenteestä. Se on rakennettu eri moduuleista, jotka tarjoavat erilaista dataa. Kaiken kaikkiaan moduuleita on yhdeksän. Ne ovat: Geocoding, Reverse geocoding, Stop information, Stops in area, Line information, Routing between two points, Cycling route, Data validity ja User statistics. Esimerkiksi Routing between two points-moduuli palauttaa reitti-informaation kahden koordinaattipisteen välillä. Taulukossa 1 näkyy moduulien tarkemmat kuvaukset.

20 Taulukko 1. Reittiopas-rajapinnan moduulit (Reittiopas API 2013). Moduuli Geocoding Reverse Geocoding Stop information Stops in area Line information Routing between two points Cycling route Data validity User statistics Kuvaus Palauttaa käyttäjälle paikkainformaatiota, kuten koordinaatit, katujen nimet yms. annetun hakusanan mukaan. Hakusana voi olla esim. Helsinki. Parametri: geocode Palauttaa käyttäjälle paikkainformaatiota, kuten koordinaatit, katujen nimet yms. annetuiden koordinaattien mukaan. Parametri: reverse_geocode Palauttaa käyttäjälle pysäkki-informaatiota annetun pysäkkikoodin perusteella. Parametri: stop Palauttaa käyttäjälle pysäkit alkaen lähimmäisestä annetuiden koordinaattien mukaan. Parametri: stops_area Palauttaa käyttäjälle infoa joukkoliikenteen linjoista mm. annetuiden pysäkkien perusteella. Parametri: lines Palauttaa käyttäjälle reitti-informaation kahden koordinaattipisteen välillä. Parametri: route Etsii parhaan pyöräilyreitin kahden koordinaattipisteen välillä. Parametri: cycling Palauttaa käyttäjälle ajankohdan, jonka aikana rajapinnasta saatava informaatio on voimassa. Parametri: validity Palauttaa käytettyjen HTTP-pyyntöjen lukumäärän. Parametri: stats Palveluita pyydetään URL-parametrien avulla. URL-parametri on URLosoitteessa oleva muuttuja, jolle asetetaan arvo. Jokainen Reittiopas-rajapinnan moduuli määrittelee erikseen, mitä parametreja se hyväksyy. Moduuli valitaan parametrilla request ja sen asettaminen on pakollista. Rajapinnan käyttö vaatii myös user - ja pass -parametrit. Nämä parametrit ovat käyttäjätunnus sekä salasana. Turvallisuussyistä jätän käyttäjän oikeat tunnistetiedot esittämättä

21 tulevissa esimerkeissä. Liitteessä 1 näkyy Cycling route-moduulin pyyntö(request)-parametrit. Reittiopas-rajapinnan URL-osoite on http://api.reittiopas.fi/hsl/prod/. Kun käyttäjä haluaa käyttää esimerkiksi Cycling route-moduulia, hänen pitää tunnistetietojen lisäksi ensiksi asettaa request -niminen parametri, joka valitsee moduulin. http://api.reittiopas.fi/hsl/prod/? request=cycling&user=esimerkki&pass=salasana URL-osoitteessa parametrit laitetaan? -merkin perään. Tämän jälkeen parametrit kirjoitetaan periaatteella parametrin nimi=arvo. Liitteestä 1 näkee, kuinka Cycling route-moduuli hyväksyy from - ja to -parametrit. Arvoiksi tulee laittaa GPS-järjestelmän mukaiset leveys- ja pituusasteet pilkulla erotettuna. Kun parametreja on useita, tulee ne eroittaa & -merkillä. Seuraava esimerkki sisältää from - ja to -parametrit. http://api.reittiopas.fi/hsl/prod/? request=cycling&user=esimerkki&pass=salasana&from=2546445,6675512 &to=2549445,6675513 Yllä oleva esimerkki hakee pyöräilyreitin annettujen koordinaattien mukaan Cycling route-moduulista. Reittiopas-rajapinta tarjoaa eri koordinaatistojärjestelmiä, joita voi käyttää HTTP-pyynnöissä. Nämä ovat KKJ1, KKJ2, KKJ3, WGS84 ja Mercator. Oletuksena rajapinta käyttää WGS84-järjestelmää, jota käytetään myös tämän opinnäytetyön esimerkeissä. epsg_in-parametri määrittelee käytetyn koordinaattijärjestelmän HTTP-pyynnölle ja epsg_out HTTP-vastaukselle. (Reittiopas API 2013)

22 4.4 Reittiopas-rajapinnan käyttö Windows Phonella HTTP-pohjaisten web-palveluiden käyttö vaatii HTTP-pyynnön suorittamista asiakasohjelmassa..net-ohjelmistokehys tarjoaa kaksi erilaista tapaa HTTPpyyntöjen tekemiseen Windows Phonella. Kehittäjän tulee käyttää joko WebClient- tai HttpWebRequest-luokkaa (How to: Make Requests to HTTP- Based Services 2013). HttpWebRequest-luokka tarjoaa monipuolisemmat mahdollisuudet HTTPpyyntöjen suorittamiseen. Sen kanssa voi lukea esimerkiksi kuvatiedoston, kun taas WebClient voi ainoastaan operoida tekstipohjaisilla resursseilla. Alla on esimerkki HttpWebRequest-luokan käytöstä. HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://api.reittiopas.fi/hsl/ prod/?request=cycling&from=2546445,6675512&to=2549445,6675513"); request.begingetresponse(new AsyncCallback(Response), request); void Response(IAsyncResult result) HttpWebRequest request = result.asyncstate as HttpWebRequest; WebResponse resp = request.endgetresponse(result); Stream stream = resp.getresponsestream(); StreamReader reader = new StreamReader(stream); string data = reader.readtoend(); WebClient-luokka on pelkistetty versio HttpWebRequest-luokasta. Sen tarkoitus on yksinkertaistaa yleisimpiä operaatioita, kuten HTTP-vastauksen lukemista. Sen käyttö on täten helpompaa ja yksinkertaisempaa kuin HttpWebRequestluokan. WebClient-luokalla voi ainoastaan hakea tekstipohjaisia resursseja. Kehittäjän tulee ensiksi luoda instanssi WebClient-luokasta. Tämän jälkeen pitää kutsua DownloadStringAsync-metodia, jonka parametriksi syötetään webpalvelun URL-osoite. Tämä metodi hoitaa resurssin hakemisen lähteestä. Alla on esimerkki HTTP-pyynnön suorittamisesta ja vastauksen lukemisesta WebClient-luokkaa käyttäen.

23 //Alusta ja suorita http-pyyntö string destination_url = " http://api.reittiopas.fi/hsl/prod/?request=cycling& from=2546445,6675512&to=2549445,6675513"; WebClient httpclient = new WebClient(); httpclient.downloadstringasync(new Uri(destination_url)); httpclient.downloadstringcompleted += new DownloadStringCompletedEventHandler(httpclient_DownloadStringComp leted); //Luodaan metodi vastauksen lukemista varten void httpclient_downloadstringcompleted(object sender, DownloadStringCompletedEventArgs e) MessageBox.Show(e.Result); Esimerkissä destination_url -muuttuja sisältää Reittiopas-rajapinnan osoitteen URL-parametrien kanssa. Haettu resurssi näkyy alla JSON-muotoisena. "length" : 5175.2299999999996, "path" : [ "length" : 6.2300000000000004, "name" : "Otaniemi", "points" : [ "x" : 2546445, "y" : 6675512, "x" : 2546439.0969929998, "y" : 6675513.9825368002 ], "type" : "unknown", "length" : 160.27000000000001, "name" : "Otaniemi", "points" : [ "x" : 2546439.0969929998... Reittiopas-rajapinta tarjoaa myös alla näkyvän XML-muotoisen vastauksen jos asiakasohjelma niin haluaa. Silloin tulee lisätä format -parametri destination_url -muuttujaan, ja antaa sille arvoksi xml. <response> <length>5175.23</length> <path>

24... <node> <length>6.23</length> <name>otaniemi</name> <type>unknown</type> <points> <node> <x>2546445</x> <y>6675512</y> </node> 4.5 Projektin haasteet Testaus oli esimerkkisovelluksen haastavin vaihe. Reittiopas-rajapinta on Helsingin joukkoliikenteen omistama palvelu. Tämä tarkoittaa, että rajapinta tarjoaa informaatiota vain pääkaupunkiseudun joukkoliikenteestä. Koska sovellus kehitettiin Turussa, testaus piti toteuttaa testiarvoilla. Koordinaattiparametrit piti syöttää manuaalisesti koodiin, koska puhelimen paikannusta ei voinut käyttää. Testausarvoina käytin noin kahtakymmentä eri leveys- ja pituusastetta, jotta sain luotettavat tulokset. Alla on esimerkki testauksessa käytetyistä arvoista. /* Test-coordinates: * 24.928265,60.187377 * 24.828265,60.187377 * 24.828265,60.287377 * 24.898265,60.246377 * 24.715265,60.229377 *... *... */ string testurl="http://api.reittiopas.fi/hsl/prod/? center_coordinate=24.928265,60.187377 Microsoftin Windows Phone SDK:n mukana tuleva Windows Phone-emulaattori oli periaatteessa hyödytön tämän sovelluksen testauksessa, koska sovelluksen toteuttamiseen tarvittiin itse matkapuhelimen sisällä olevaa komponenttia ja sen toiminnallisuutta.

25 5 ESIMERKKISOVELLUKSEN TOTEUTUS 5.1 Sovelluksen luominen Ensiksi pitää luoda uusi Windows Phone -sovellus Visual Studiolla. Silverlightiin perustuvissa sovelluksissa MainPage.xaml-tiedosto sisältää sovelluksen ulkoasun. MainPage.xaml.cs-tiedosto sisältää C#-koodin, jota tarvitaan toiminnallisuuden ohjelmoimiseen. Yhteys Reittiopas-rajapintaan toteutetaan tässä tiedostossa. Kuvassa 6 on MainPage.xaml.cs avattuna. Kuva 6. MainPage.xaml.cs.

26 5.2 Puhelimen sijainnin selvittäminen Esimerkkisovelluksen idea on hakea lähimmät joukkoliikennepysäkit. Ensiksi pitää siis selvittää puhelimen oma sijainti. Puhelimen paikantamiseen.netohjelmistokehys tarjoaa GeoCoordinateWatcher-luokan, jonka avulla tarvittavat leveys- ja pituusasteet saadaan selville. GeoCoordinateWatcher-luokan käyttöönotto vaatii viittaamista System.Device-komponenttiin. Kuva 7. System.Device-komponentin lisääminen. Kun System.Device-komponentti on lisätty, pitää MainPage.xaml.cs-tiedostoon lisätä viite System.Device.Location-nimiavaruuteen alla kuvatulla tavalla. using System.Device.Location; namespace ReittiopasClient

27... Ensimmäinen tehtävä on luoda instanssi GeoCoordinateWatcher-luokasta MainPage-luokan sisällä, jotta instanssi on käytössä kaikissa MainPage-luokan metodeissa. public partial class MainPage : PhoneApplicationPage GeoCoordinateWatcher geowatcher = null; Kun sovellus suoritetaan, MainPage-luokan konstruktoria kutsutaan. Konstruktori-metodissa asetetaan geowatcher-oliolle GeoPositionAccuracyominaisuus, joka määrittelee puhelimen käyttämään sisäänrakennettua GPSvastaanotinta ja geowatcher_positionchanged-metodi, jota kutsutaan, kun puhelimen sijainti muuttuu. // Konstruktori public MainPage() InitializeComponent(); geowatcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High); geowatcher.positionchanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>> (geowatcher_positionchanged); geowatcher.start(); Nyt geowatcher_positionchanged-metodissa voidaan noutaa WGS84- järjestelmän mukaiset leveys- ja pituusasteet. void geowatcher_positionchanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) GeoCoordinate currentlocation = e.position.location; double currentlongitude = e.position.location.longitude; double currentlatitude = e.position.location.latitude;

28 5.3 HTTP-pyyntö Reittiopas-rajapintaan Kun puhelimen sijainti on tiedossa, voidaan luoda HTTP-pyyntö, jonka URLosoitteessa käytetään tätä informaatiota parametrina. Reittiopas-rajapinnassa oleva Stops in area-moduuli hyväksyy liitteessa 2 olevat parametrit. Leveys- ja pituuspiirimuuttujat on tarkistettava ja tarvittaessa muutettava rajapinnan hyväksymään muotoon ennen niiden käyttämistä. Sovellus käyttää WGS84-koordinaattijärjestelmää, jolloin koordinaatit on oltava desimaalimuodossa. Kuva 8. Koordinaatit parametreja varten. Seuraavaksi muodostetaan URL-osoite rajapinnan Stops in area-moduuliin, johon liitetään äsken muokatut koordinaattimuuttujat. string reittiopas_url = string.format(http://api.reittiopas.fi/hsl/prod/? request=stops_area&center_coordinate=0,1&user=esimerkki &pass=salasana&limit=3&epsg_in=wgs84&epsg_out=wgs84&format=xml, currentlongitude, currentlatitude); center_coordinate-parametri ottaa currentlongitude- ja currentlatitudemuuttujat arvoikseen. Tämä parametri ilmaisee puhelimen sijainnin ja etsii sen

29 perusteella lähimmät joukkoliikennepysäkit. Limit-parametrin arvoksi on asetettu 3, mikä tarkoittaa, että rajapinta palauttaa kolme lähintä pysäkkiä. epsg_in- ja epsg_out-parametrit määrittelevät käytetyn koordinaatistojärjestelmän. Stops in area-moduuliin voi myös asettaa diameter-parametrin, joka määrittelee alueen, jolta pysäkkejä etsitään. Jos sitä ei määritellä, oletusarvona on 1500 metriä. Alla on HTTP-pyynnön koodi Reittiopas-rajapintaan. WebClient httpclient = new WebClient(); httpclient.downloadstringasync(new Uri(reittiopas_url)); httpclient.downloadstringcompleted += new DownloadStringCompletedEventHandler(httpclient_ DownloadStringCompleted); Sovelluksen on tarkoitus hakea yksittäisiä sijainteja, eikä päivittää sijaintiaan koko ajan puhelimen liikkuessa. Siksi geowatcher-olion voi poistaa seuraavalla koodilla geowatcher_positionchanged-metodissa. geowatcher.stop(); geowatcher.dispose(); geowatcher = null; 5.4 HTTP-vastauksen käsittely ja tulosten esittäminen httpclient_downloadstringcompleted-metodissa käsitellään Reittiopasrajapinnan vastaus. Stops in area-moduulilla on liitteen 3 mukaiset muuttujat HTTP-vastauksessa. Mikäli koordinaattiparametri olisi esimerkiksi 24.928265,60.187377 niin äskeisen luvun HTTP-pyynnön vastaus näyttäisi seuraavanlaiselta. [ "address" : "Helsinginkatu", "city" : "Helsinki", "code" : "1140453", "codeshort" : "0244", "coords" : "24.931817574195,60.184495859355",

30 ] "dist" : 377, "name" : "Kaupunginpuutarha", "address" : "Helsinginkatu", "city" : "Helsinki", "code" : "1140452", "codeshort" : "0243", "coords" : "24.93197974655,60.184494719888", "dist" : 382, "name" : "Kaupunginpuutarha", "address" : "Toivonkatu 1-3", "city" : "Helsinki", "code" : "1140107", "codeshort" : "2065", "coords" : "24.92444066684,60.184296154162", "dist" : 404, "name" : "Töölön kisahalli" Koska limit-parametrin arvo oli 3, niin rajapinta palautti kolme lähintä joukkoliikenteen pysäkkiä. Jokainen pysäkki sisältää liitteessä 3 olevat muuttujat. Koska lisäsin HTTP-pyyntöön format-parametrin arvolla xml on vastaus XML-muotoinen. Vastaus on esitetty alla. <response> <node> <code>1140453</code> <name>kaupunginpuutarha</name> <city>helsinki</city> <coords>24.931817574195,60.184495859355</coords> <dist>377</dist> <codeshort>0244</codeshort> <address>helsinginkatu</address> </node> <node> <code>1140452</code> <name>kaupunginpuutarha</name> <city>helsinki</city> <coords>24.93197974655,60.184494719888</coords> <dist>382</dist> <codeshort>0243</codeshort> <address>helsinginkatu</address> </node> <node> <code>1140107</code> <name>töölön kisahalli</name> <city>helsinki</city> <coords>24.92444066684,60.184296154162</coords> <dist>404</dist>

31 <codeshort>2065</codeshort> <address>toivonkatu 1-3</address> </node> </response> Sovellus tulee käyttämään XML-muotoista vastausta. Yllä oleva vastaus on kuitenkin vielä merkkijono ja se pitää muuttaa XML-dokumentiksi ennen kuin vastauksen sisältöä voi lukea kunnolla..net-ohjelmistokehys tarjoaa XDocument-luokan, jonka instanssi edustaa XML-dokumenttia (Xdocument class 2013). Sen avulla XML-dokumentin käsittely httpclient_downloadstringcompleted-metodissa on yksinkertaista. Ensiksi täytyy luoda instanssi XDocument-luokasta alla kuvatulla tavalla. void httpclient_downloadstringcompleted(object sender, DownloadStringCompletedEventArgs e) XDocument xdoc = XDocument.Parse(e.Result, LoadOptions.None); Kun XML-dokumenttia edustava xdoc-olio on luotu, sen elementteihin voi kohdistaa Linq-kyselyn. Linq, Language Integrated Query on.netohjelmistokehyksen komponentti, joka mahdollistaa datakyselyt muun muassa XML-dokumentteihin (System.Xml.Linq Namespace 2013). XML-dokumentissa näkyy, että jokaisen pysäkin data, kuten name - ja city -elementit ovat node - elementtien sisällä. Linq-kysely suoritetaan XML-dokumentin jokaiseen node - elementtiin alla esitetyllä tavalla. var itemdata = from query in xdoc.descendants("node") Sovellukseen luodaan Stop-luokka, joka sisältää samannimiset jäsenet kuin XML-dokumentissa olevat muuttujat node -elementin sisällä. Täten Stopluokan olio vastaa yhtä XML-dokumentissa olevaa pysäkkiä. Linq-kyselyssä jokaisesta node -elementistä luodaan siis Stop-luokan olio. var itemdata = from query in xdoc.descendants("node") select new Stop

32 Code = (string)query.element("code").value, Name = (string)query.element("name").value, City = (string)query.element("city").value, Coords = (string)query.element("coords").value, Dist = (string)query.element("dist").value, CodeShort = (string)query.element("codeshort").value, Address = (string)query.element("address").value, ; Nyt itemdata-olio sisältää kaikki XML-dokumentista luodut Stop-oliot. Sovellukseen luodaan vielä StopsInArea-luokka, jolla on vain yksi jäsen. Stopsjäsen on lista, joka sisältää kaikki Stop-luokan oliot. public class StopsInArea private List<Stop> _stops; public List<Stop> Stops get return this._stops; set this._stops = value; Sovellus käy itemdata-olion läpi foreach -silmukassa, jossa se lisää, joka kierroksella Stop-olion StopsInArea-luokan Stops-listaan. StopsInArea stoplist = new StopsInArea(); stoplist.stops = new List<Stop>(); foreach (var item in itemdata) stoplist.stops.add(item); Nyt jokainen pysäkki on Stops-listassa ja helposti saatavilla. Seuraava koodi tulostaa ensimmäisen pysäkin nimen ja osoitteen puhelimen näytölle kuvan 9 mukaisesti. MessageBox.Show("Pysäkki: " + stoplist.stops[0].name + "\netäisyys: " + stoplist.stops[0].dist+ " metriä");

33 Kuva 9. Pysäkki-informaation tulostus. Jos kaikki pysäkit halutaan tulostaa, voidaan Stops-lista lukea helposti foreachsilmukalla alla olevan esimerkin mukaisesti. foreach (var stop in stoplist.stops) MessageBox.Show("Pysäkki: " + stop.name + "\netäisyys: " + stop.dist + " metriä"); Ohjelmakoodi on esitetty kokonaisuudessaan liitteessä 4.

34 6 YHTEENVETO Opinnäytetyön tuloksena oli tutkielma web-palveluista ja miten niitä käytetään Windows Phone 7 -sovelluksessa. Työn toinen painopiste oli Windows Phone 7 -sovelluskehitys. Työn esimerkkisovellus onnistui hyvin esittämään kuinka Windows Phone 7 -sovellus pystyy hyödyntämään web-palvelujen tarjoamaa informaatiota. Työn aihealue oli mielestäni erittäin kiinnostava ja motivoiva ja siksi päädyin siihen. Minulla oli myös jonkin verran käytännön työkokemusta web-palveluista työharjoitteluni ajalta, joka auttoi huomattavasti. Näin tämän aiheen luonnollisena jatkumona opitulle tiedolle ja täten en olisi voinut keksiä parempaa aihetta. Esimerkkisovelluksen toteutus oli opinnäytetyön haastavin ja eniten aikaa vievä osa. Minulla ei ollut aiempaa kokemusta Windows Phone - sovelluskehityksestä, joten siihen perehtyminen vei paljon aikaa. Mielestäni esimerkkisovellus tuo kuitenkin hyvin esille sen, että jo vähäisellä osaamisella on mahdollista tehdä dynaaminen Windows Phone -sovellus, joka on vuorovaikutuksessa eri tietojärjestelmien kanssa. Jälkeenpäin voin todeta oppineeni todella paljon Windows Phone -sovelluskehityksestä. Esimerkkisovelluksen tarkoitus oli toimia vain yksinkertaisena malliesimerkkinä ja siksi siinä olisi paljon jatkokehitysmahdollisuuksia. Sovellusta voisi jatkokehittää esimerkiksi parantamalla ulkoasua, sekä lisäämällä toiminnallisuuksia, kuten esimerkiksi pysäkkien yhdistäminen Microsoftin Bingkarttapalveluun.

35 LÄHTEET Abeysinghe S. 2008. RESTful PHP Web Services. Olton Birmingham, GBR: Packt Publishing Ltd. Application Platform Overview for Windows Phone 2013. Microsoft Developer Network. Viitattu 16.1.2013 http://msdn.microsoft.com/en-us/library/ff402531(v=vs.92).aspx Balani, Naveen; Hathi, Rajeev 2009. Apache CXF Web Service Development : Develop and Deploy SOAP and RESTful Web Services. Olton Birmingham, GBR: Packt Publishing Ltd. Creating a New Windows Phone Project 2013. Microsoft Developer Network. Viitattu 3.3.2013 http://msdn.microsoft.com/en-us/library/gg680268(v=pandp.11).aspx Download Center 2013. Microsoft.com. Viitattu 17.1.2013 http://www.microsoft.com/en-us/download/details.aspx?id=27570 Fielding R. et.al 1999. Method definitions. Viitattu 20.1.2013 http://www.w3.org/protocols/rfc2616/rfc2616-sec9.html How to: Make Requests to HTTP-Based Services 2013. Microsoft Developer Network. Viitattu 25.1.2013 http://msdn.microsoft.com/en-us/library/cc197953 HTTP and XHTML 2013. cs.uregina.ca. Viitattu 14.2.2013. http://www.cs.uregina.ca/links/class-info/215/deng_webpage/basichtml.html Lecrenski, Nick; Watson, Karli 2011. Beginning Windows Phone 7 Application Development : Building Windows Phone Applications Using Silverlight and XNA. Hoboken, NJ, USA: Wrox..NET-framework 4.5 2013. Microsoft Developer Network. Viitattu 16.1.2013 http://msdn.microsoft.com/en-us/library/w0x726c2.aspx.net-framework Interview Questions 2013. dotnetcurry. Viitattu 16.1.2013 http://www.dotnetcurry.com/showarticle.aspx?id=64 Nokia.com 2013. Lumia 800. Viitattu 2.3.2013 http://www.nokia.com/global/products/phone/lumia800/ Petzold, C. 2010. Programming Windows Phone 7. New York City and Roscoe, New York: Microsoft Press. REST vs. SOAP The Right WebService 2013. Geeknizer.com. Viitattu 12.3.2013 http://geeknizer.com/rest-vs-soap-using-http-choosing-the-right-webservice-protocol/ Service-Oriented Architecture (SOA) and Web Services 2013. Oracle.com. Viitattu 28.2.2013 http://www.oracle.com/technetwork/articles/javase/soa-142870.html System.Xml.Linq-namespace 2013. Microsoft Developer Network. Viitattu 24.2.2013 http://msdn.microsoft.com/en-us/library/bb299195.aspx Valtionkonttori 2013. Avoin data. Viitattu 14.2.2013 http://www.suomi.fi/suomifi/tyohuone/yhteiset_palvelut/avoin_data/

XDocument class 2013. Microsoft Developer Network. Viitattu 24.2.2013 http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx 36

Liite 1 Cycling route-moduulin request-parametrit Parameter Description Type name request Chooses module. In this case Request type. Always required. cycling from Start point coordinate. Coordinates separated by comma (e.g. <x,y>). to Destination point coordinate. Coordinates separated by comma (e.g. <x,y>). via List of via point coordinates. List of coordinates separated by comma (e.g. <x,y>). List members are separated by pipes (" "). Optional, maximum number of via points is 5. profile String Optional, routing profile: kleroweighted = default profile klerotarmac = prefers cycle paths with tarmac klerosand = prefers gravel paths kleroshortest = prefers shortest route elevation 0 or 1. Optional, default value 0. If 1, elevation information of the route will be shown in the result.

Liite 2 Stops in area-moduulin request-parametrit Parameter name Description Type request Chooses module. In this case stops_area Request type. Always required. center_coordinate Coordinate Coordinates separated by comma (e.g. <x,y>) limit Limit the amount of stops. Optional, no default value. diameter Length of the side of the square. Optional, default 1500, max 5000 meters.

Liite 3 Stops in area-moduulin response-kentät Field nr. Name Type Description 1 code Number Unique, long code of the stop, e.g. 1040602. 2 name String Name of the stop. 3 city String City the stop is located in. 4 coords Coordinate Coordinates of the stop (<x,y>, e.g. 2551217,6681725). 5 dist Number Distance of the stop to the center coordinate. 6 codeshort String(4-6) Stop s short code. 7 address String Stop s address.

Liite 4 Esimerkkisovelluksen koodi using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using Microsoft.Phone.Controls; using System.Device.Location; using Newtonsoft.Json; using System.Xml.Linq; namespace ReittiopasClient public partial class MainPage : PhoneApplicationPage GeoCoordinateWatcher geowatcher = null; // Konstruktori public MainPage() InitializeComponent(); geowatcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High); geowatcher.positionchanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(geoWatcher_PositionChanged); geowatcher.start(); void geowatcher_positionchanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) GeoCoordinate currentlocation = e.position.location; double currentlongitude = e.position.location.longitude; double currentlatitude = e.position.location.latitude; /* Test-coordinates: * 24.928265,60.187377 * 24.828265,60.187377 * 24.828265,60.287377 * 24.898265,60.246377 * 24.715265,60.229377 *... *... */ string reittiopas_url = "http://api.reittiopas.fi/hsl/prod/?center_coordinate=24.928265,60.187377&limit=3&epsg _in=wgs84&epsg_out=wgs84&request=stops_area&user=xxxx&pass=xxx&format=xml";

Liite 4 WebClient httpclient = new WebClient(); httpclient.downloadstringasync(new Uri(reittiopas_url)); httpclient.downloadstringcompleted += new DownloadStringCompletedEventHandler(httpclient_DownloadStringCompleted); /* * geowatcher olion poistaminen * * * geowatcher.stop(); geowatcher.dispose(); geowatcher = null; */ //Luodaan metodi vastauksen lukemista varten void httpclient_downloadstringcompleted(object sender, DownloadStringCompletedEventArgs e) MessageBox.Show(e.Result.ToString()); XDocument xdoc = XDocument.Parse(e.Result, LoadOptions.None); var itemdata = from query in xdoc.descendants("node") select new Stop Code = (string)query.element("code").value, Name = (string)query.element("name").value, City = (string)query.element("city").value, Coords = (string)query.element("coords").value, Dist = (string)query.element("dist").value, CodeShort = (string)query.element("codeshort").value, Address = (string)query.element("address").value, ; StopsInArea stoplist = new StopsInArea(); stoplist.stops = new List<Stop>(); foreach (var item in itemdata) stoplist.stops.add(item); foreach (var stop in stoplist.stops) MessageBox.Show("Pysäkki: " + stop.name + "\netäisyys: " + stop.dist + " metriä");

Liite 4 public class StopsInArea private List<Stop> _stops; public List<Stop> Stops get return this._stops; set this._stops = value; public class Stop private string _code; private string _name; private string _city; private string _coords; private string _dist; private string _codeshort; private string _address; private List<Stop> _stops; public List<Stop> StopsInArea get return this._stops; set this._stops = value; public string Code get return this._code; set this._code = value; public string Name get return this._name; set this._name = value; public string City get return this._city; set this._city = value; public string Coords get return this._coords; set this._coords = value;

Liite 4 public string Dist get return this._dist; set this._dist = value; public string CodeShort get return this._codeshort; set this._codeshort = value; public string Address get return this._address; set this._address = value;