几行c#代码,轻松搞定一个女大学生

的作业。。。

哈哈,标题党了哈,但是是真的,在外面敲代码,想赚点外快,接到了一个学生的期末考试,是一个天气预报的程序。程序并不难。

看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格。

不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人工什么时候这么低廉了。。。oh my god

​50十块,你跟我开什么国际玩笑!!不够意外惊喜还是有的,居然是个妹子嘿嘿,哎呀什么钱不钱的多伤感情。

老哥送你一套代码,小妹妹以后你好好学习,不懂得问老哥,然后顺利的家了微信(妹子很漂亮)。

废话不多说开干,这个程序最大的难点就是找一个合适的天气预报接口,以前没有做过类似的程序,导致70%时间浪费在找接口以及调试接口上,不过也算我运气好,找到了一个免费接口,接口的技术兄弟人也超棒,大大的赞。

在这里分享给大家 https://www.tianqiapi.com/?action=doc(刚两天界面就改版了,差点以为我访问错了)。

作为一个免费的接口,数据详细到这种程度,大大的良心,应付一个大学生的期末作业,简直大材小用。

找接口后,立马开始写代码,由于女学生要的紧,哦,不催得紧,所以代码一切从简,只保留核心功能,锦上添花的东西一律不要,首先搞定http请求类。

    public class HttpHelper
{
/// <summary>
/// 发送请求的方法
/// </summary>
/// <param name="Url">地址</param>
/// <param name="postDataStr">数据</param>
/// <returns></returns>
private string HttpPost(string Url, string postDataStr)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);
Stream myRequestStream = request.GetRequestStream();
StreamWriter myStreamWriter = new StreamWriter(myRequestStream,
Encoding.GetEncoding("gb2312"));
myStreamWriter.Write(postDataStr);
myStreamWriter.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close(); return retString;
} public string HttpGet(string Url, string postDataStr)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8"; HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close(); return retString;
} }

http请求搞定,接下来获取所有的城市,主要为了效验用户的输入,不可能你输入什么我都去查天气,就算你是女学生也不行,大家伙说对不?

https://cdn.huyahaha.com/tianqiapi/city.json 全国所有城市接口。

https://www.tianqiapi.com/api/ 天气接口,下为参数列表。

参数 名称 备注
version 版本标识 必填字段 目前可用值: v1
callback jsonp参数 如: jQuery.Callbacks
以下参数三选一
cityid 城市编号 如: 101120201
city 城市名称 如: 海淀,青岛,大连 (不要带市和区)
ip IP地址 此IP地区的天气

大家可以自行查看下接口的返回值,简直详细到丧心病狂。

添加几个model类用来序列化json

    public class City
{
public string cityZh { get; set; }
public string id { get; set; }
}
public class Data
{
public string day { get; set; }
public string date { get; set; }
public string week { get; set; }
public string wea { get; set; }
public string air { get; set; }
public string air_level { get; set; }
public string air_tips { get; set; } public string tem { get; set; }
public string tem1 { get; set; }
public string tem2 { get; set; } public string win_speed { get; set; }
}
public class Weather
{
public string cityid { get; set; }
public string update_time { get; set; }
public string city { get; set; } public List<Data> data { get; set; }
}

准备工作完成,开始调用接口,由于只有两个接口,接口文档又很清楚,对方技术兄弟也很给力。没费什么劲接口调试成功,于是写了下面两个方法。

    public class Weather
{
HttpHelper http = new HttpHelper();
List<City> citys = new List<City>(); public model.Weather GetWeather(string name)
{
if (!citys.Any(a => a.cityZh == name.Trim()))
{
throw new KeyNotFoundException("未找到相关城市,请您检查城市名");
}
var data = http.HttpGet($"https://www.tianqiapi.com/api/?version=v1&city={name}", "").TrimStart('(');
return JsonConvert.DeserializeObject<model.Weather>(data);
} public void GetCity()
{
var data = http.HttpGet(" https://cdn.huyahaha.com/tianqiapi/city.json", "");
citys = JsonConvert.DeserializeObject<List<City>>(data);
}
}

然后就是界面设计,为了省时间没有使用更强大的wpf,而使用更简单快捷的winform5分钟界面撸完。

为了方便连控件名都没有改(如果在公司这么做,codereview一定会被骂)label3显示当前城市,6个groupbox为6天的天气,一个查询一个退出,界面搞定。

然后编写按钮事件,绑定数据,没什么难度。

    public partial class Form1 : Form
{ public Form1()
{
InitializeComponent();
AllCity();
}
Weather weather = new Weather(); private void Form1_Load(object sender, EventArgs e)
{
BindData(city_name.Text.Trim());
} private void AllCity()
{
weather.GetCity();
} private void label1_Click(object sender, EventArgs e)
{ } private void select_Click(object sender, EventArgs e)
{ BindData(city_name.Text.Trim());
} private void BindData(string city)
{
model.Weather w = null;
try
{
w = weather.GetWeather(city);
}
catch (KeyNotFoundException ex)
{
MessageBox.Show(ex.Message);
}
catch (Exception)
{
MessageBox.Show("查询失败请重试");
}
if (w != null)
{
SetView(w);
}
}
private void SetCurrentCity(string city)
{
label3.Text = city;
}
private void SetView(model.Weather model)
{
SetCurrentCity(model.city);
SetLable(model.data);
SetGroupBox(model.data);
} private void SetLable(List<Data> model)
{
var d = model[];
label2.Text = WeaderString(model[]);
label4.Text = WeaderString(model[]); ;
label5.Text = WeaderString(model[]); ;
label6.Text = WeaderString(model[]); ;
label7.Text = WeaderString(model[]); ;
label8.Text = WeaderString(model[]); ;
}
private string WeaderString(Data d)
{
string txt = $"日期:{d.date}\r\n天气:{d.wea}\r\n当前温度:{d.tem}\r\n温度:{d.tem1} - {d.tem2}\r\n空气质量:{d.air_level}\r\n空气指数:{d.air}\r\n风力:{d.win_speed}";
return txt;
}
private void SetGroupBox(List<Data> model)
{
groupBox1.Text = model[].week;
groupBox2.Text = model[].week;
groupBox3.Text = model[].week;
groupBox4.Text = model[].week;
groupBox5.Text = model[].week;
groupBox6.Text = model[].week;
} private void button1_Click(object sender, EventArgs e)
{
Application.Exit();
}
}

搞定了,来看下运行效果,界面虽然简单可是功能完美实现。

代码下载 https://pan.baidu.com/s/1jOX52_w3VEgGBEPkLbOXXw

几行c#代码,轻松搞定一个女大学生的更多相关文章

  1. 几行代码轻松搞定python的sqlite3的存取

    很简单: 存数据: 1.加载sqlite3驱动(只需一行代码) 2.用驱动执行查询语句(只需一行代码) 取数据: 1.加载sqlite3驱动(只需一行代码) 2.用驱动执行查询语句(只需一行代码) 乍 ...

  2. 用python 30行代码,搞定一个简单截图调取的百度识字功能

    在做一个数据标注过程中人工需要识别文字. 想了想写了一个小脚本, 大致过程这样的. 截图功能写了好久也没写明白,索性直接调用第三方的截图工具了,在采用qq或者微信截图时,截图完成后保存大致保存在剪切板 ...

  3. 一行代码轻松搞定各种IE兼容问题,IE6,IE7,IE8,IE9,IE10

    在网站开发中不免因为各种兼容问题苦恼,针对兼容问题,其实IE给出了解决方案Google也给出了解决方案百度也应用了这种方案去解决IE的兼容问题? 百度源代码如下: <!Doctype html& ...

  4. 【微服务】之六:轻松搞定SpringCloud微服务-API网关zuul

    通过前面几篇文章的介绍,我们可以轻松搭建起来微服务体系中比较重要的几个基础构建服务.那么,在本篇博文中,我们重点讲解一下,如何将所有微服务的API同意对外暴露,这个就设计API网关的概念. 本系列教程 ...

  5. Python高级特性: 12步轻松搞定Python装饰器

    12步轻松搞定Python装饰器 通过 Python 装饰器实现DRY(不重复代码)原则:  http://python.jobbole.com/84151/   基本上一开始很难搞定python的装 ...

  6. 【微服务】之四:轻松搞定SpringCloud微服务-负载均衡Ribbon

    对于任何一个高可用高负载的系统来说,负载均衡是一个必不可少的名称.在大型分布式计算体系中,某个服务在单例的情况下,很难应对各种突发情况.因此,负载均衡是为了让系统在性能出现瓶颈或者其中一些出现状态下可 ...

  7. 使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发具体解释

    转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50909410 使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发具体 ...

  8. 【微服务】之七:轻松搞定SpringCloud微服务-API权限控制

    权限控制,是一个系统当中必须的重要功能.张三只能访问输入张三的特定功能,李四不能访问属于赵六的特定菜单.这就要求对整个体系做一个完善的权限控制体系.该体系应该具备针区分用户.权限.角色等各种必须的功能 ...

  9. 基于 CODING 轻松搞定持续集成

    点击观看视频教程 带你一步一步搞定 CODING 持续集成 持续集成加速软件交付 持续集成这个概念是由 Grady Booch 在 1991 年首次提出,随后成为了 DevOps 的核心实践之一.持续 ...

随机推荐

  1. 开源项目福利-github开源项目免费使用Azure PipeLine

    微软收购Github后,很多人猜想微软可能会砍掉VSTS,然而事实VSTS并没有砍掉,关于Azure Devops的详细信息可以查看 这篇博客,如果想查看原文也可以从链接里提供的原始地址里查看. 今天 ...

  2. jQuery中关于全选、全不选和反选

    1.首先我们要获取当前点击的对象,然后得到点击事件,   判断他的状态如果是checked的话就把该第二行的选中,   否则就取消选中. 2.当第二列功能小项没有全部选中时,该行第一列的复选款也要取消 ...

  3. [PHP] 简单多进程并发

    企邮搬家进程管理逻辑,经过简化后的功能实现 <?php //守护进程 umask(0); //把文件掩码清0 if (pcntl_fork() != 0){ //是父进程,父进程退出 exit( ...

  4. Java开发笔记(二十五)方法的输入参数

    前面通过main方法介绍了方法的定义形式,对于方法的输入参数来说,还有几个值得注意的地方,接下来分别对输入参数的几种用法进行阐述.一个方法可以有输入参数,也可以没有输入参数,倘若无需输入参数,则方法定 ...

  5. WebLogic使用总结

    一. WebLogic安装 WebLogic使用总结(一)——WebLogic安装 一.下载WebLogic 到Oracle官网http://www.oracle.com/ 下载WebLogic(根据 ...

  6. MySQL 基础知识梳理学习(五)----详解MySQL两次写的设计及实现

    一 . 两次写提出的背景或要解决的问题 两次写(InnoDB Double Write)是Innodb中很独特的一个功能点.因为Innodb中的日志是逻辑的,所谓逻辑就是比如插入一条记录时,它可能会在 ...

  7. MySQL慢查询日志释疑总结

      之前写了一篇"MySQL慢查询日志总结",总结了一些MySQL慢查询日志常用的相关知识,这里总结一下在工作当中遇到关于MySQL慢查询日志的相关细节问题,有些是释疑或自己有疑惑 ...

  8. nginx多server配置记录

    直接在配置文件(/etc/nginx/nginx.conf)中添加如下代码: server { listen 8080; server_name 192.168.100.174:8080; root ...

  9. chrome打开收藏夹的网站在新的标签页

    chrome浏览器在新的标签页打开收藏夹的网址,现在设置不了,而且右键,在新标签页中打开有点烦..下面说说直接打开的方式. 方法1: 鼠标滚轮,直接点击收藏夹的网址,即可 方法2: ctrl + 鼠标 ...

  10. netstat简介

    netstat是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表,实际的网络连接以及每一个网络接口设备的状态信息,netstat用于显示与IP,TCP,UDP和ICMP协议相关的统计数据,一 ...