在C#中通过使用Newtonsoft.Json库来解析天地图地理编码(GeoCoder)服务接口返回的Json格式的数据,以及HttpWebRequest 设置不完全时服务器返回“远程服务器返回错误: (403) 已禁止”解决方法

天地图地理编码(GeoCoder)服务接口返回的Json格式的数据,如下所示:

http://api.tianditu.gov.cn/geocoder?ds={"keyWord":"北京市"}&tk=您的tk密钥

返回结果实例:

{
"msg":"ok",
"location":
                {
                    "level":"地名地址",
                    "lon":116.40100299989,
                    "lat":39.90311700025,
                    "keyWord":"北京市"
                },
"searchVersion":"6.0.0",
"status":"0"
}

本文简要介绍如何在C#中通过使用Newtonsoft.Json库来解析Json格式的数据。

1、创建主应用程序(控制台或Winform程序均可);

2、引入Newtonsoft.Json.dll。

3、在工程中创建如下的类,添加using Newtonsoft.Json;名称空间的引用:

using System;
using System.Collections.Generic;
using System.Text;

using Newtonsoft.Json;

namespace WorldWind
{
    public class LocationTDT
    {
        [JsonProperty("level")]
        public string Level { get; set; }

        [JsonProperty("lon")]
        public double Lon { get; set; }

        [JsonProperty("lat")]
        public double Lat { get; set; }

        [JsonProperty("keyWord")]
        public string KeyWord { get; set; }
    }


    class RecordResultTDT
    {
        [JsonProperty("msg")]
        public string Msg { get; set; }

        [JsonProperty("location")]
        public LocationTDT Location { get; set; }

        [JsonProperty("searchVersion")]
        public string SearchVersion { get; set; }

        [JsonProperty("status")]
        public int Status { get; set; }
    }
}

4、构建URL服务连接,发起Http请求,获取响应数据流中的内容,调用JsonConvert.DeserializeObject()方法将字符串反序列化为对象即可,调用的cs文件中需要添加using Newtonsoft.Json;名称空间的引用:

            stringm_CurrentSearchUri="http://api.tianditu.gov.cn/geocoder?ds={"keyWord":"北京市"}&tk=您的tk密钥";
            // 发送要求
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(m_CurrentSearchUri);
                    //下面的代码一定要加上,在天地图网站会发生"远程服务器返回错误: (403) 已禁止。"
                    request.Method = "GET";
                    request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                    request.Headers.Add("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
                    request.UserAgent = "Mozilla/5.0 (Windows NT 5.2; rv:12.0) Gecko/20100101 Firefox/12.0";

                    // 取得响应
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    StreamReader sr = new StreamReader(response.GetResponseStream());
                    //得到一个json字符串
                    string joResultTemp = sr.ReadToEnd().ToString();
                    //将返回的json数据转为JSON对象
                    RecordResultTDT joResult = JsonConvert.DeserializeObject<RecordResultTDT>(joResultTemp);//返回天地图的Json对象

 5、另外,天地图的请求URL在浏览器直接输入时会返回正确的Json结果,但是在C#应用程序中当HttpWebRequest 的属性设置不完全时服务器返回“远程服务器返回错误: (403) 已禁止”

  解决方法:

  如上面的步骤4中提到的,HttpWebRequest 的Method、Accept、Headers、UserAgent等属性(UserAgent非常重要,否则服务器认为是非法请求)一定要设置完整。在访问百度地图的地理编码(GeoCoder)服务接口时不设置上述参数也能够正常访问。

 
posted @ 2020-02-23 19:32  rainbow70626  阅读(1151)  评论(0编辑  收藏  举报