Paradigm Shift Design

ISHITOYA Kentaro's blog.

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は普通に作らないとダメ.