2012-03-07 20 views
0

WebサービスAPI用のC#クライアント(documentation here、PDFの警告)を書き込もうとしています。 APIへの各要求は、HTTP GET呼び出しであり、URIにエンコードされたパラメータを使用します。レスポンスは、 "text/xml"というContent-Typeの整形式XMLドキュメントです。すべてのリクエストには、APIキーをパラメータとして含める必要があります。.NETクライアントからGETリクエストを非WCFのプレーンXML Webサービスに送信

私は Webサービスプロキシを自分で実装することができますが、私の直感では、実際にこのようなものを考えるように支払われる人々によって書かれた.NETライブラリに建てがあるということです。すべての私の検索と読書から、私はWCFを使いたいと思うが、クライアントとしてWCFを使用する方法を文書で見つけることができず、普通のXML Webサービスを呼び出す。 .NETまたはVisual Studioで私を助けることができるものはありますか?私はsvcutil.exeを使っていませんか?私が話しているWebサービスにはメタデータがないためです。

+1

簡単なWebRequestはできますか? – user1096188

+0

@ user1096188これは私が望むものに近いですが、私のためにオブジェクトへの応答をシリアル化しますか?私はどのようにしてオブジェクトを定義しますか?ツールはありますか?または、私は自分自身でXMLを処理する必要がありますか? XmlSerializerで? – Jay

答えて

0

HttpWebRequestを使用すると、WebサービスAPI、XMLライブラリを呼び出して、レスポンス文字列を.netオブジェクトに変換できます。ここで は簡単な例である(それはエラーメッセージ私は有効なキーを持っていないとして、「供給無効なAPIアクセスキー」を取得します):

public static T DeserializeString<T>(String content) 
    { 
     using (TextReader reader = new StringReader(content)) 
     { 
      XmlSerializer s = new XmlSerializer(typeof(T)); 
      return (T)s.Deserialize(reader); 
     } 
    } 
:XmlUtil.DeserializeStringは次のように定義されて

static void Main(string[] args) 
    { 
     HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(
      @"http://www.ctabustracker.com/bustime/api/v1/gettime?key=89dj2he89d8j3j3ksjhdue93j" 
      ); 

     using (WebResponse resp = req.GetResponse()) 
     { 
      using (Stream respStream = resp.GetResponseStream()) 
      { 
       using(StreamReader reader = new StreamReader(respStream)) 
       { 
        String respString = reader.ReadToEnd(); 

        Debug.WriteLine(respString); 
        TestBusTimeResponse response = XmlUtil.DeserializeString<TestBusTimeResponse>(respString); 
        Debug.WriteLine(response.Error.Message); 
       } 
      } 
     } 

     Console.ReadLine(); 
    } 

とTestBusTimeResponseは(あなたが実際にVSに同梱xsdユーティリティを使用して、APIドキュメントに指定されたXMLスキーマでこのビジネス・オブジェクト・クラスを生成することができます)のように定義されます。

[XmlRoot("error")] 
public class TestBusTimeResponseError 
{ 
    [XmlElement("msg")] 
    public String Message 
    { 
     get; 
     set; 
    } 
} 
// Response in the following format: 
// <?xml version="1.0"?> 
// <bustime-response><error><msg>Invalid API access key supplied</msg></error></bustime-response> 
[XmlRoot("bustime-response")] 
public class TestBusTimeResponse 
{ 
    [XmlElement("error")] 
    public TestBusTimeResponseError Error 
    { 
     get; 
     set; 
    } 
} 
+0

ありがとう!私はこれが私が必要としていた方法であることを認識しましたが、逆直列化クラスの助けが必要でした。これは大きな助けになる – Jay

0

ASP.NET Web APIの一部である新しいHttpClientクラスを見てみましょう。私はstackexchange APIと話をうまく使ってきました。使い方はとても簡単です。

+0

私はHttpClientの唯一の問題は、URIを形成し、リクエストするたびに応答XMLをシリアライズする必要があることです。私はこれを避けることを望んでいました。おそらくツールを使ってモデルを定義し、必要なクラスを生成しました。 – Jay

+0

あなたのためにそれを行うメッセージハンドラを書くことができると確信しています:) –

+0

ありがとうアントニー、私はおそらくします。 .NETに組み込まれているものがあるかどうかを確認したかったのですが、フレームワークに付属するものは、おそらく私が書いたものよりも、よりよく実証され、より重くテストされているからです。 – Jay

関連する問題