1.概要
無料でありWeb APIから情報が取得できるサービスが非常にたくさん存在しています。
非常に便利でお世話になることも多いのではないでしょうか?
但し、無料であるが故、いつサービスが終了するのかと・・・
この問題はついて回ってきます。
そんな時にサービスを変更しても
柔軟に対応できる関数があると非常に便利です。
今回はグローバルIPを取得するサービスを使ってみます。
Web APIをたたくとレスポンスフォーマットがjsonであることが多いかと思いますが
各サービスごとにkeyが異なったりでなかなか汎用化が難しかったので
これに対応する関数を作成してみようかと思います。
2.Jsonファイルを扱う
Jsonファイルを扱う方法はたくさんあるかと思いますが
今回は【Newtonsoft.Json】を使います。
詳しい使い方は下記の記事を参照して下さい。
www.chuken-engineer.com
3.やりたいこと
2つのサイトからグローバルIPを取得しようかと思います。
取得出来る情報は下記のとおりで
サービスごとにkeyが異なります。
これを同じ関数を使って必要な情報を取得します。
下記の例でいえば
【query】【origin】
と異なるkeyから同じ値を取得します。
{ "status": "success", "country": "Japan", "countryCode": "JP", "region": "**", "regionName": "****", "city": "****", "zip": "*********", "lat": **.****, "lon": ***.****, "timezone": "Asia/Tokyo", "isp": "*******", "org": "*********", "as": "*************", "query": "***.***.***.***" }
{ "origin": "***.***.***.***" }
4.スクリプト
Formロード時にサイトにアクセスしてグローバルIPを取得します。
取得したデータはTextBoxに表示します。
using System; using System.Net.Http; using System.Threading.Tasks; using System.Windows.Forms; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace grobalIPcheck { public partial class Form1 : Form { string u = "http://ip-api.com/json/"; string k = "query"; //string u = "http://httpbin.org/ip"; //string k = "origin"; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { var task = Task.Run(() => { return GetIPaddress(u, k); }); textBox1.Text = task.Result; } private async Task<string> GetIPaddress(string url, string key) { HttpClient client = new HttpClient(); // タイムアウト時間の設定(5秒) client.Timeout = TimeSpan.FromMilliseconds(5000); // 以下処理 var response = await client.GetAsync(url); var resString = await response.Content.ReadAsStringAsync(); JObject deserial = (JObject)JsonConvert.DeserializeObject(resString); return deserial[key].ToString(); } } }