Δι@ύγεια OpenData API

Συνεχίζοντας την προσπάθεια σε C# να χρησιμοποιήσω το API της Δι@ύγειας για να πάρω πληροφορίες για το έγγραφο που με ενδιαφέρει και μετά από αρκετές αποτυχημένες δοκιμές είπα να προσπαθήσω με παλιότερο κώδικα που ξέρω ότι δουλεύει.

Οπότε παίρνοντας τον παλιότερο κώδικα που χρησιμοποιούσα για να διαβάζω τον html κώδικα μιας ιστοσελίδας (και να βρίσκω την εξωτερική ip του router μου) έκανα την πρώτη δοκιμή στο http://et.diavgeia.gov.gr/f/all/search/results.php?include_ada=1&field_ada=%CE%924%CE%A9%CE%9B%CE%A7-%CE%A8%CE%9A%CE%92

Ο αρχικός κώδικας ήταν λοιπόν:

public static bool CheckDiavgeiaADA(string ADA)
{
    string url = "http://et.diavgeia.gov.gr/f/all/search/results.php?include_ada=1&field_ada=" + ADA;
    string webPage = GetWebResponse(url);
    return true;
}

public static string GetWebResponse(string url)
{
    try
    {
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
        request.Method = WebRequestMethods.Http.Get;
        request.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.Reload);
        System.Net.HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);
        String responseText = reader.ReadToEnd();
        reader.Close();
        dataStream.Close();
        response.Close();
        return responseText;
    }
    catch (System.Net.WebException ex)
    {
        System.Diagnostics.Debug.Write(ex.Message);
        return string.Empty;
    }
}

Η πρώτη προσπάθεια ήταν επιτυχής, μπορούσα να διαβάσω το περιεχόμενο της ιστοσελίδας. Μετά ήρθε η ώρα να διαβάσω τη σελίδα όπως λέει το api (http://opendata.diavgeia.gov.gr/api/decisions?ada=Β4ΩΛΧ-ΨΚΒ)

Ο κώδικας έγινε

public static bool CheckDiavgeiaADA(string ADA)
{
    try
    {
        //ADA = System.Web.HttpUtility.UrlEncode(ADA);
        string s = "http://opendata.diavgeia.gov.gr/api/decisions?ada=" + ADA;
        string xmlStr = GetWebResponse(s);
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xmlStr);
    }
    catch (WebException e)
    {
        System.Diagnostics.Debug.Print(e.ToString());
    }
    return false;
}

και εμφανίστηκε πάλι το γνωστό web exception όπως και πριν. Πλέον όμως ο κώδικας έσκαγε μέσα στην GetWebResponse που σε άλλες σελίδες δουλεύει κανονικά. Έκανα μια δοκιμή σε άλλες σελίδες που επιστρέφουν xml document για να επιβεβαιώσω ότι ο κώδικας αυτός δεν περιορίζεται στο να διαβάζει μόνο text και html documents και πάλι έπαιξε κανονικά.

Άρα κάτι “βιτσιόζικο” έχει ο συγκεκριμένος server της διαύγειας. Είτε είναι πολύ αυστηρός στις απαιτήσεις του για να επιστρέψει ένα σωστό xml document, είτε πολύ “αρρωστιάρικος” και αν δεν του δώσεις το request όπως ακριβώς το χρειάζεται, τα χάνει και “βαράει μπιέλες”. Θα έλεγα μάλλον το δεύτερο, κρίνοντας από το exception stack.

Αφού είχα ήδη την προηγούμενη εμπειρία από τον php κώδικα που δούλεψε προσθέτοντας μερικά επιπλέον directions στο request (για την file_get_contents) είπα να κάνω μια προσπάθεια να βάλω τα ίδια directions μήπως και γίνει κάτι.

Ξεκίνησα προσθέτοντας τη γραμμή

request.KeepAlive = true;

μετά το request.CachePolicy αλλά δεν υπήρξε καμία διαφορά. Σειρά είχε λοιπόν να προστεθεί και το

request.Accept = "*/*";

και το θαύμα έγινε. Η σελίδα μου επέστρεψε το xml document. Μα είναι δυνατόν; Τέλος πάντων αφού έπαιξε…

Ο κώδικας τελικά που παίζει και για τις υπόλοιπες ιστοσελίδες και για το OpenData web service της Δι@ύγειας έγινε:

public static bool CheckDiavgeiaADA(string ADA)
{
    try
    {
        //ADA = System.Web.HttpUtility.UrlEncode(ADA);
        string s = "http://opendata.diavgeia.gov.gr/api/decisions?ada=" + ADA;
        string xmlStr = GetWebResponse(s);
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xmlStr);
    }
    catch (WebException e)
    {
        System.Diagnostics.Debug.Print(e.ToString());
    }
    return false;
}

public static string GetWebResponse(string url)
{
    try
    {
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
        request.Method = WebRequestMethods.Http.Get;
        request.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.Reload);
        request.Accept = "*/*";
        request.KeepAlive = true;
        System.Net.HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);
        String responseText = reader.ReadToEnd();
        reader.Close();
        dataStream.Close();
        response.Close();
        return responseText;
    }
    catch (System.Net.WebException ex)
    {
        System.Diagnostics.Debug.Write(ex.Message);
        return string.Empty;
    }
}

…εντάξει όχι ακριβώς έτσι γιατί η function CheckDiavgeiaADA δεν κάνει κάτι χρήσιμο έτσι όπως είναι, αλλά τώρα έχουμε το xml για να πάρουμε τα στοιχεία που μας ενδιαφέρουν.