Jsonicを利用してC#からJSONウェブサービスを呼ぶ
掲題の通り,Teeda+S2DaoなWebアプリケーションにjsonicを入れてサービスを作ったので,C#から呼んでみようという話.
結論として,C#から使うことが前提ならばS2Axis使った方がずっと楽.
ま,でもやってみたのでかく.
//必要なパッケージ //using System.Net; //using System.IO; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(this.endpoint); request.Method = "POST"; String postdata = "{\"method\":\"WiiBoard.test\",\"params\":{},\"id\":1}"; Byte[] postbytes = Encoding.UTF8.GetBytes(postdata); request.ContentLength = postbytes.Length; Stream stream = request.GetRequestStream(); stream.Write(postbytes, 0, postbytes.Length); try { HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Console.WriteLine(new StreamReader(response.GetResponseStream()).ReadToEnd()); } catch (WebException ex) { Console.WriteLine(ex.ToString()); }
で,とりあえずできる.
はまりポイント,request.ContentLengthをちゃんと設定しないとレスポンスが返ってこない.
何がひどいって,それがExceptionもなにも飛ばないので,理由がまったくわからない.
つか同期なら
HttpRequest request = new HttpRequest("http://hoge.com"); String result = request.send("request");
にしろよ.面倒くさすぎる.
あと,jsonic.C#ではparamsが予約語なのでJSON.NETを使って
using System; using System.Collections.Generic; using System.Text; using System.Collections; namespace com.semcode.wii.db { class Request { private String _method; private Hashtable _params; private int _id; public String method { get { return this._method; } set { this._method = value; } } public Hashtable params { get { return this._params; } set { this._params = value; } } public int id { get { return this._id; } set { this._id = value; } } } }
とかいうクラスを作って,
protected String createJSONRequest(String method, Hashtable param) { Request request = new Request(); request.method = method; request.params = param; request.id = 1; return JavaScriptConvert.SerializeObject(request); }
とかやりたいけど.予約語なので無理.ううっ.
というわけで,Requestは普通に作らないとダメ.