前言
因为需要做了一个天气预报的功能,所以在网上找了一些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 + ' ' + 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);
题外话:
中文转Unicode:HttpUtility.UrlEncodeUnicode(string str);
转换后中文格式:"%uxxxx" 举例:"柳_abc123" 转换结果是:"%u67f3_abc123"
Unicode转中文1:HttpUtility.UrlDecode(string str);
str格式:"%uxxxx" ,举例:"%u67f3_abc123"
Unicode转中文2:Regex.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请求的事例,如果有兴趣的话可以下载源码看。
网友评论