0

以下のコードをhttp://www.stum.de/2009/12/22/using-restsharp-to-consume-restful-web-services/から更新しました。RestSharpの最新バージョンに更新しました:

var client = new RestClient("http://carma.org");
var request = new RestRequest("api/1.1/searchPlants", Method.GET);
request.AddParameter("location", 4338);
request.AddParameter("limit", 10);
request.AddParameter("color", "red");
request.AddParameter("format", "xml");
var plants = client.Execute<PowerPlantsDTO>(request);
MessageBox.Show(plants.Count.ToString())


using System.Collections.Generic;

namespace RestTest.Model
{
    public class CityDTO
    {
        public string value { get; set; }
    }

    public class LocationDTO
    {
        public CityDTO city { get; set; }
        public int zip { get; set; }
        public double latitude { get; set; }
        public double longitude { get; set; }
    }

    public class item
    {
        public string name { get; set; }
        public LocationDTO location { get; set; }
    }

    public class PowerPlantsDTO : List<item> { }
}

残念ながら、plants.countはplants.dataのように空ですが、XMLデータが返されます(以下のスクリーショットを参照)。私が何かを逃しているかどうか誰かが私を助けてくれますか?

スクリーンショット: ここに画像の説明を入力してください

ここに画像の説明を入力してください

Errmessageは示しています

「パラメータ数の不一致。」

そして返されるXMLコンテンツ:

<?xml version="1.0" encoding="UTF-8"?>
<items>
<item>
    <id>49046</id>
    <name>WATSON COGEN</name>
    <carbon>
        <past>4503176.0000</past>
        <present>4582168.0000</present>
        <future>5401482.0000</future>
    </carbon>
    <energy>
        <past>3827727.0000</past>
        <present>3017826.0000</present>
        <future>3506896.0000</future>
    </energy>
    <intensity>
        <past>2352.9250</past>
        <present>3036.7339</present>
        <future>3080.4910</future>
    </intensity>
    <location>
        <continent>
            <id>5</id>
            <value>North America</value>
        </continent>
        <country>
            <id>202</id>
            <value>United States</value>
        </country>
        <latitude>33.8219</latitude>
        <longitude>-118.2633</longitude>
        <state>
            <id>644</id>
            <value>California</value>
        </state>
        <city>
            <id>60769</id>
            <value>Carson</value>
        </city>
        <metroarea>
            <id>3203</id>
            <value>Los Angeles-Long Beach</value>
        </metroarea>
        <county>
            <id>4338</id>
            <value>Los Angeles</value>
        </county>
        <congdist>
            <id>5298</id>
            <value>Diane Watson</value>
        </congdist>
        <zip>90749</zip>
    </location>
</item>
<item>
    <id>7233</id>
    <name>CARSON COGEN</name>
    <carbon>
        <past>432223.9062</past>
        <present>440564.3125</present>
        <future>451224.5000</future>
    </carbon>
    <energy>
        <past>461797.6875</past>
        <present>348148.4062</present>
        <future>355428.0938</future>
    </energy>
    <intensity>
        <past>1871.9189</past>
        <present>2530.8989</present>
        <future>2539.0481</future>
    </intensity>
    <location>
        <continent>
            <id>5</id>
            <value>North America</value>
        </continent>
        <country>
            <id>202</id>
            <value>United States</value>
        </country>
        <latitude>33.8759</latitude>
        <longitude>-118.2491</longitude>
        <state>
            <id>644</id>
            <value>California</value>
        </state>
        <city>
            <id>60769</id>
            <value>Carson</value>
        </city>
        <metroarea>
            <id>3203</id>
            <value>Los Angeles-Long Beach</value>
        </metroarea>
        <county>
            <id>4338</id>
            <value>Los Angeles</value>
        </county>
        <congdist>
            <id>5433</id>
            <value>Juanita Millender-McDonald</value>
        </congdist>
        <zip>90746</zip>
    </location>
</item>

</items>

スタックトレース:

   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index)
   at RestSharp.Deserializers.XmlDeserializer.Map(Object x, XElement root)
   at RestSharp.Deserializers.XmlDeserializer.HandleListDerivative(Object x, XElement root, String propName, Type type)
   at RestSharp.Deserializers.XmlDeserializer.Deserialize[T](IRestResponse response)
   at RestSharp.RestClient.Deserialize[T](IRestRequest request, IRestResponse raw)
4

1 に答える 1

1

スタックトレースを見ると、XMLを逆シリアル化する機能に間違いなく関連していました。あなたがフォローしているチュートリアルは2009年のものであり、RestSharpがその下から少し変わっているようです。

サンプルを機能させることができ、'plants.Data`を使用して植物のリストにアクセスできましたが、わずかな変更が1つあります。

var plants = client.Execute<PowerPlantsDTO>(request);

になります

var plants = client.Execute<List<item>>(request);

RestSharpコードを見ると、XMLノード名を判別するためにXmlDeserializer内の総称引数の名前を使用しているようです。好奇心から、XmlElement属性を使用してXMLノードの名前に影響を与えようとしましたが、この属性をクラスに適用することはできません。私の知る限り、最善の策は、期待されるリターン構造に明示的に一致するようにDTOを形成することです。

お役に立てば幸いです。

于 2012-04-27T20:32:10.740 に答える