6 Ağustos 2018 Pazartesi

İngilizce Kelime Getirme - Oxford API (Dictionary, not Translation)

    S.a. Arkadaşlar,
    Geçenlerde sözlükle ilgili bir api arıyordum. Sürekli translate tarzı apiler ve componentlerle karşılaştım, fakat benim aradığım kendi dilinde çeviri yapan , bildiğimiz ilk okullarda kelime baktığımız sözlüktü. Önce bunun Türkçe için olanını aradım, onla ilgili tam bir sonuca varamadım, ama daha sonra tekrar bakacağım, bunla ilgili yardımlarını beklerim, ama yabancı diller için bir çok api denedim, en sonunda oxford apide karar kıldım. Onun da bir sürü dil seçeneği vardı ama C# yoktu. Bugünkü konumuz bununla ilgili.
     Öncelikle doküman sayfasından yararlanabilirsiniz ama dediğim C# yoktu. Ben de java (aslında android) kodlarını evirip çevirip C# uyarlamaya çalıştım. Bunları yaparken karşılaştığım zorlukları ve nasıl çözdüğümü anlatacağım. Daha sonra veriyi json olarak alıp onu liste atıp konuyu bitirmeyi düşünüyorum.

     Buradan web request örneği buldum ve onun üzerinden yola çıktım, daha sonra başlığa json , api id ve api key verilmesi gerekiyordu, burada json ile accepte problem yaşadım. Json headerlere değil direk requeste eklemem gerekli olduğunu anladım. Bununla ilgili de şu kaynağa bakabilirsiniz. Daha sonra  response dosyasını önce streame oradan da stringe çevirmemiz lazımdı. Onun için de bir metod tanımladım. Bu metodu yazarken yararlandığım kaynağa da buradan erişebilirsiniz. En son da json parçalayıp liste attık ve artık istediğimiz şeye ulaşmış olduk :)

    Artık kodlar paylaşma vakti geldi ..
   Bu OxfordAPI classımız
private static string dictionaryEntries(string kelime, string dil)
{
    string language = dil;
    string word = kelime;
    string word_id = word.ToLower();
    return "https://od-api.oxforddictionaries.com:443/api/v1/search/" + language + "?q=" + word_id;
}

public static string IngilizceKelimeGetir(string kelime, string dil)
{
    string app_id = "id";//size verecekleri bilgileri buraya girebilirsiniz
    string app_key = "key";
    try
    {
       Uri serverURL = new Uri(dictionaryEntries(kelime, dil));
       HttpWebRequest wreq = WebRequest.Create(serverURL) as HttpWebRequest;

        wreq.Accept = "*/*";//json 
        wreq.Headers.Add("app_id", app_id);
        wreq.Headers.Add("app_key", app_key);

        HttpWebResponse response = (HttpWebResponse)wreq.GetResponse();
        var json = GetDocumentContents(response);

        return json.ToString();

     }
     catch (Exception e)
     {
         return e.InnerException.ToString();
     }
}

private static string GetDocumentContents(HttpWebResponse Request)
{
     string documentContents;
     using (Stream receiveStream = Request.GetResponseStream())
     {
         using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8))
         {
             documentContents = readStream.ReadToEnd();
         }
    }
        return documentContents;
}

    Burası da sınıfımızı çağırdığımız metodumuz
public void Sozluk(string word,string language)
{
   string mean = OxfordAPI.IngilizceKelimeGetir(word,language).GetString();//"door","en"
   List<string> list = new List<string>();

   JObject json = new JObject();
   dynamic x = Newtonsoft.Json.JsonConvert.DeserializeObject(mean);
   var equalityWords= x.results;
   foreach (var equalityWord in equalityWords)
   {
       list.Add(equalityWord.word);
   }
}
Yazımızı burada bitirir, iyi çalışma dilerim.

3 yorum: