sexta-feira, 27 de março de 2015

C# Web Service

After the last post on PHP web service now we develop a web service with Visual Studio 2013 in C#.

Let's start by creating a ASP.NET project.




In the next screen wee choose an Empty application.

Now in we add a new item to our project.


And next choose Web Service


By now the Visual Studio have created the basic structure of our web service with one method called HelloWorld as an example.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace WebApplication2
{
    /// <summary>
    /// Summary description for WebService1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
    // [System.Web.Script.Services.ScriptService]
    public class WebService1 : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
    }
}

In this post were going to create a new method call listUsers that will receive one parameter indicating the type of output to be generated, XML or JSON.

        [WebMethod]
        public string listUsers(string op)
        {
            if(op=="json"||op=="JSON")
                return devolveRegistosJSON();

            return devolveRegistosXML();
        }

As is easy to see in the code there are two function that get called, one return a JSON string and the other a XML string. Let's look at that code.

Starting with de JSON.

        public string devolveRegistosJSON()
        {
            var jsonSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            string registos = "";
            string strligacao = "Database=database;Server=server;UID=user;PWD=password;";
            MySqlConnection ligacao = new MySqlConnection(strligacao);
            ligacao.Open();
            string strSQL = "SELECT * FROM test_users;";
            MySqlCommand comando = new MySqlCommand(strSQL, ligacao);
            MySqlDataReader dados = comando.ExecuteReader();
            List<Registo> lDados = new List<Registo>();
            while (dados.Read())
            {
                lDados.Add(new Registo(int.Parse(dados[0].ToString()), dados[1].ToString(), dados[2].ToString()));
            }
            registos = jsonSerializer.Serialize(lDados);
            lDados.Clear();
            dados.Dispose();
            comando.Dispose();
            ligacao.Close();
            ligacao.Dispose();
            return registos;
        }

This functions uses a serializer to generate the JSON string from a list of objects with the data.
Each object is an instance of the class Registo.

        [Serializable]
        public class Registo
        {
            public int id { get; set; }
            public string name { get; set; }
            public string country { get; set; }
            public Registo(int id, string name, string country)
            {
                this.id = id;
                this.name = name;
                this.country = country;
            }
        }

Next the XML version.

public string devolveRegistosXML()
        {
            string registos = "";
            string strligacao = "Database=database;Server=server;UID=user;PWD=password;";
            MySqlConnection ligacao = new MySqlConnection(strligacao);
            ligacao.Open();
            string strSQL="SELECT * FROM test_users;";
            MySqlCommand comando = new MySqlCommand(strSQL,ligacao);
            MySqlDataReader dados = comando.ExecuteReader();
            while (dados.Read())
            {
                string registo = "";
                registo=adicionarTag("id", dados[0].ToString());
                registo += adicionarTag("name", dados[1].ToString());
                registo += adicionarTag("country", dados[2].ToString());
                registos += adicionarTag("registo", registo);
            }
            registos = adicionarTag("registos", registos);
            dados.Dispose();
            comando.Dispose();
            ligacao.Close();
            ligacao.Dispose();
            return registos;
        }

This functions makes use of a helper function to generate the xml tags.

        public string adicionarTag(string tag, string texto)
        {
            string temp = "<" + tag + ">" + texto + "</" + tag + ">";
            return temp;
        }

When testing the service this is the page presented.


If we choose the new method the browser shows us a form with a field for the parameter of the service.

By choosing XML we get.
If the choice is JSON.
Get the project here.

PHP Web Service

In this post we will be developing a web service with PHP. The data is in a MySQL database and the output format is optional between XML and JSON.

In order to collect the data we will be using MySQLi.

The service won't be requiring any credentials and there won't be any limits to the number of requests although in some cases it would be necessary to consider that possiblities.

First we must define the values needed to connect with the MySQL server.

<?php
$server="server";
$user="userid";
$password="userpassword";
$database="database";
?>

Next is the code that implements de service per say.

<?php

require "config.php";
//connect to the database server
$ligacao=new mysqli($server,$user,$password,$database);
//check connection
if($ligacao->connect_error)
die("Error connecting: ".$ligacao->connect_error);

//options
if(isset($_GET['format']))
$output=$_GET['format'];
else
$output="xml"; //by default
if($output!='JSON'&&$output!='json'&&$output!='xml'&&$output!='XML')
$output="xml";

//data
$sql="SELECT * FROM test_users";
$resultado=$ligacao->query($sql);
if($resultado->num_rows>0){
while($registo=$resultado->fetch_assoc())
$registos[]=array("record"=>$registo);

header("Cache-Control: no-cache, must-revalidate");
if($output=="xml"||$output=="XML"){
$conteudo="Content-type: text/xml; charset=utf-8";
header($conteudo);
$linhas="";
$linha="";
foreach($registos as $index => $registo)
{
if(is_array($registo)){
foreach($registo as $campo => $valor){
if(is_array($valor)){
foreach($valor as $tag => $val)
$linha.=adicionarTag($tag,htmlentities($val));
}
$linha=adicionarTag("record",$linha);
}
}
$linhas = $linhas.$linha;
$linha="";
}
echo adicionarTag("records",$linhas);
}else{
$conteudo="Content-type: application/json; charset=utf-8";
header($conteudo);
echo json_encode(array('records'=>$registos));
}
}
function adicionarTag($tag,$texto){
$temp="<".$tag.">".$texto."</".$tag.">";
return $temp;
}
?>

The project can be downloaded here.

quinta-feira, 26 de março de 2015

Consuming a web service

In this post we will be talking about on how to consume a web service with a desktop application developed with C#.

A web service is an API that is available through the internet and it can be used within the rules established. Some services are free and don't require identification others have to be payed or have some limitations on the number of calls or data produced.

To demonstrate this concept we will be using a free service that the European Central Bank maintains in the following url http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml.
This service returns the Euro currency rate over other countries currencies. This information is encapsulated in XML.

Since we are making a desktop app we have to keep in mind the responsiveness of the user interface (GUI). So the request of the data must not occur in the main thread of the application which could block the GUI during the wait that is associated with exchange of information through the internet.

The main code is this:

async void downloadXML()
        {
            string url = "http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml";
            WebRequest pedido = WebRequest.Create(url);
            WebResponse resposta = await pedido.GetResponseAsync();
            XDocument documento = XDocument.Load(resposta.GetResponseStream());
            textBox1.Text = documento.ToString();

            //preencher a listview
            XmlDocument xml = new XmlDocument();
            xml.LoadXml(documento.ToString());
            XmlNodeList lista = xml.GetElementsByTagName("Cube");
            foreach (XmlNode no in lista)
            {
                if (no.Attributes.Count > 1)
                {
                    ListViewItem novo = new ListViewItem(no.Attributes[0].InnerXml);
                    novo.SubItems.Add(no.Attributes[1].InnerXml);
                    listView1.Items.Add(novo);
                }
            }
        }

This function is asynchronous. The execution starts normally and goes until the line where the reserved word AWAIT define a process that can promote a delay so the control is return to the line that call this asynchronous function. When this request terminates the function concludes the processing and updates the UI with the data returned (learn more).

The code that lays ahead is simply to manipulate the XML recived.

The project