美文网首页C#与.net
JS和C#(HttpWebRequest)请求天气api获取数据

JS和C#(HttpWebRequest)请求天气api获取数据

作者: NewForMe | 来源:发表于2019-06-06 20:35 被阅读0次

    前言

    因为需要做了一个天气预报的功能,所以在网上找了一些api,发现很多的都要收费或有些请求限制,最后被我找到一个完全免费且没限制,非常好的天气api:https://www.tianqiapi.com/api/,使用这个api十分简单,只需要加上一个cityid参数就可以,详细文档可以参考官网:天气api文档

    下面就直接说一下使用实例。

    一、JS请求调用

    核心请求代码如下,其实就是一个简单的ajax请求,然后再将返回数据拼接成html代码在浏览器上显示,有两个关键点,
    一:cityid我这边是写死了的,因为我的需求只是需要在网站上显示这个地方的天气,所以其实也是可以动态传参显示其他城市的,至于cityid这个值也是可以官网中获得。
    二:就是根据返回的json数据结构获取自己想要的数据,其他的就是我为了处理数据写了两个处理数据的函数,以及一些页面样式,这些详细代码我都会在文章最后可以下载。

    $.ajax({
                    url:"https://www.tianqiapi.com/api/?version=v1&cityid=101010100",
                    type: "post",
                    //data: cityid,
                    dataType: 'json',
                    contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
                    success: function (json) {
                        //console.log(json);
                        var data = json;
                        var t = '<div class="today-box">'
                            + '<div class="city" style="font-size:15px;">北京</div>'
                            + '<div class="date">' + data.data[0].date + data.data[0].week + '</div>'
                            + '<div class="pic"><img width="72px" height="72px;" src=' + getImageName(data.data[0].wea) + ' /> </div>'
                            + '<div class="wd">' + data.data[0].tem2 + "-" + data.data[0].tem1  + '</div>'
                            + '<div class="tq">' + data.data[0].wea + '&nbsp;' + data.data[0].win[0] + '</div>'
                            + '</div>';
                        t = t + '<div class="next-day-box">';
                        for (var i = 1; i < data.data.length; i++) {
                            t = t + '<div class="next-day-weather">'
                                + '<div class="zhou">' + data.data[i].week + '</div>'
                                + '<div class="date">' + formatDate(data.data[i].date, 2) + '</div>'
                                + '<div class="pic"><img width="60px" height="60px;" src=' + getImageName(data.data[i].wea) + ' /> </div>'
                                + '<div class="wd">' + data.data[i].tem2 + "-" + data.data[i].tem1  + '</div>'
                                + '<div class="tq">' + data.data[i].wea + '</div>' + '</div>';
                        }
                        t = t + '</div>';
                        $("#day7yb").html(t);
                    }
    

    效果图

    二、C#请求调用

    C#做web请求主要是用.NET封装好的类HttpWebResponse,HttpWebRequest,这两个类都是System.Net里,所以使用前要先using。
    在这里我是先创建一个公共类,里面写了两个GET与POST方法,然后这样就可以方便调用,贴上部分代码,

    public static string Get(string Url)
            {
                
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);//创建请求
                request.Proxy = null;//IP代理池
                request.KeepAlive = false;//是否一直保持连接
                request.Method = "GET";//请求方法
                request.ContentType = "application/json; charset=UTF-8";//请求内容返回格式和编码
                request.AutomaticDecompression = DecompressionMethods.GZip;//允许压缩内容,可以提高请求效率
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();//获得响应
                Stream myResponseStream = response.GetResponseStream();//将响应内容生成流
                StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
                string retString = myStreamReader.ReadToEnd();//读取所有的响应内容并将结果生成字符串
                string r = Regex.Unescape(retString);//将返回的unicode转化为中文
                myStreamReader.Close();
                myResponseStream.Close();
    
                if (response != null)
                {
                    response.Close();
                }
                if (request != null)
                {
                    request.Abort();
                }
                return r;
            }
    

    题外话,C#就这样一个GET请求写了这么多,真心有点麻烦,在这方面还是python简单,如果是python做这样的请求的话也就几行代码。

    import requests
    response = requests.get('https://www.tianqiapi.com/api?version=v1&cityid=101010100')
    response.encoding="utf-8"
    #print(response.text)
    print (response.json())
    

    回归正题,在上述C#请求中,需要注意的点有一个,就是编码问题,我当时是踩坑了,如果响应的内容是中文乱码的话,一般就是utf-8编码问题,得这里声明编码方式,StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
    如果返回的中文是unicode,就是类似这种,


    所以就需要将unicode转换为中文string r = Regex.Unescape(retString);

    题外话:
    中文转UnicodeHttpUtility.UrlEncodeUnicode(string str);
    转换后中文格式:"%uxxxx" 举例:"柳_abc123" 转换结果是:"%u67f3_abc123"
    Unicode转中文1HttpUtility.UrlDecode(string str);
    str格式:"%uxxxx" ,举例:"%u67f3_abc123"
    Unicode转中文2Regex.Unescape(string str);
    str格式:"sdfasdf\uxxxx" ,举例:"sdfasdf(\uxxxx对应的中文)"

    最后就是调用代码,因为我是用mvc写的,这里是在控制器里调用那个请求类,然后返回json字符串,这里也有一个点需要注意,就是返回的response会有很多\转义字符,这些是C#自动添加的,可以不用处理,直接返回后,转义字符就不存在。

    public ActionResult WeatherForJson()
            {
                string response= HttpWebResponseUtility.Get("https://www.tianqiapi.com/api?version=v1&cityid=101010100");
                //此时response的字符串有很多\,这是C#自动转义的,不用处理
                //string s = response.Replace(@"\","");
                //JObject jb = (JObject)JsonConvert.DeserializeObject(response);
               // string city = jb["cityid"].ToString();//这里是尝试使用json的序列化效果
                //return Json(jb, JsonRequestBehavior.AllowGet);
                return Content(response);//页面返回json字符串
                //return View();
            }
    

    返回结果:

    至于post请求其实跟get请求都差不多,就是多了请求参数的处理而已,这里就不赘述了,在代码那里我也是做了post请求的事例,如果有兴趣的话可以下载源码看。

    源码下载:https://github.com/LittleNewGod/My-CSharp

    相关文章

      网友评论

        本文标题:JS和C#(HttpWebRequest)请求天气api获取数据

        本文链接:https://www.haomeiwen.com/subject/plxuxctx.html