1

これを質問としてではなく、StackOverflow で答えを見つけることができなかった後に書いたコードをコミュニティと共有するために、ここに投稿すると思いました。誰かがコードを見て改善したい場合、それは素晴らしいことですが、必須ではありません。コンセプトとコードを簡単に理解できるように、一部のコード (try-catch ブロックとエラー処理) を省略しています。

4

2 に答える 2

0

幸いなことに、誰かが GIT で利用可能なラッパーを作成しました。リンクは次のとおりです: https://github.com/danludwig/NGeo。NuGet 経由でも利用できます。私にとって非常に便利になりました!

于 2012-11-08T21:43:52.283 に答える
0

それでは、解決する必要のある問題から始めましょう。私は、誰かが都市、州、郵便番号の組み合わせの一部または全部を入力し、 Yahoo の PlaceFinder APIを使用してその場所が正確に把握できるようにしたいと考えていました。都市と州を郵便番号から、またはその逆に解決する簡単な方法です。

このプロセスには次のものが含まれます。

  1. サーバー側で入力 (都市/州/郵便番号) を受け取る
  2. 適切なパラメーターを使用して URL を作成する (JSON 形式で応答を受け取りたかった)
  3. PlaceFinder サービスに HTTP GET リクエストを送信します。
  4. C# でオブジェクト モデルを作成して応答データを簡単に操作できるように、JSON 応答を使用します。

インポートする名前空間から始めましょう。

using System.Net; // for HttpWebRequest
using System.Text; // for utf8 encoding
using System.Web.Script.Serialization; // for json parsing
using System.IO; // for datastream

次に、リクエストの作成を見てみましょう。

string parameters = String.Empty;
UTF8Encoding utf8 = new UTF8Encoding(); // yahoo docs state utf-8 encoding
string unparsedLocation = "Beverly Hills, CA 90210"; // contrived example

parameters += "line2=" + Url.Encode(unparsedLocation); // yahoo docs say to url encode
parameters += "&flags=J"; // J = want the response formatted in json
parameters += "&appid=[your-app-id-here]"; // using your appID obtained from Yahoo
parameters = utf8.GetString(utf8.GetBytes(parameters));
WebRequest request = WebRequest.Create(@"http://where.yahooapis.com/geocode?" + parameters);
request.Method = "GET";

次に、応答を取得して、操作しやすいオブジェクト モデルに入れます。

WebResponse response = request.GetResponse();
// Check the status. If it's not OK then don't bother with trying to parse the result
if (((HttpWebResponse)response).StatusCode == HttpStatusCode.OK)
{
    // Get the stream containing content returned by the server.
    Stream dataStream = response.GetResponseStream();
    // Open the stream using a StreamReader.
    StreamReader reader = new StreamReader(dataStream);
    // Read the content.
    string responseFromServer = reader.ReadToEnd();

    JavaScriptSerializer jss = new JavaScriptSerializer();
    YahooResponse yr = jss.Deserialize<YahooResponse>(responseFromServer);

    // You may not want such strict checking; if not, remove the "NO ERROR" check
    if (yr.ResultSet.Error == 0 && yr.ResultSet.ErrorMessage.ToUpper() == "NO ERROR" && yr.ResultSet.Found > 0)
    {
        // inside here is where you can do whatever you need to.
        // ex. 1 - get the first result
        Result result = yr.ResultSet.results[0];

        // ex. 2 - loop through results
        foreach (Result r in yr.ResultSet.results)
        {
            // add values to a List<T> or something useful
        }
    }
}

// always do this as a matter of good practice
response.Close();

しかし、待ってください。最後の重要な部分が 1 つ欠けています。YahooResponse' ' オブジェクトとは何ですか? クラス定義はどのように見えますか? これが私が思いついたものです:

namespace PlaceFinder
{
    public class YahooResponse
    {
        public ResultSet ResultSet { get; set; }
    }

    public class ResultSet
    {
        public string version { get; set; }
        public int Error { get; set; }
        public string ErrorMessage { get; set; }
        public string Locale { get; set; }
        public int Quality { get; set; }
        public int Found { get; set; }
        public Result[] results { get; set; }
    }

    public class Result
    {
        public int quality { get; set; }
        public string latitude { get; set; }
        public string longitude { get; set; }
        public string offsetlat { get; set; }
        public string offsetlon { get; set; }
        public int radius { get; set; }
        public string name { get; set; }
        public string line1 { get; set; }
        public string line2 { get; set; }
        public string line3 { get; set; }
        public string line4 { get; set; }
        public string house { get; set; }
        public string street { get; set; }
        public string xstreet { get; set; }
        public string unittype { get; set; }
        public string unit { get; set; }
        public string postal { get; set; }
        public string neighborhood { get; set; }
        public string city { get; set; }
        public string county { get; set; }
        public string state { get; set; }
        public string country { get; set; }
        public string countrycode { get; set; }
        public string statecode { get; set; }
        public string countycode { get; set; }
        public string uzip { get; set; }
        public string hash { get; set; }
        public long woeid { get; set; }
        public int woetype { get; set; }
    }
}

PlaceFinder サービスの詳細については、http://developer.yahoo.com/geo/placefinder/guide/ をご覧ください

于 2012-06-24T11:21:07.163 に答える