http 协议消息发送及接收 (查询天气为例)python实现
程序员文章站
2022-05-21 11:56:32
要求:基于流(stream)套接字(socket)编写一个客户端(client)程序;程序可连接(connect)某服务器网站(比如:t.weather.sojson.com);程序向服务器网站发送 http 请求(GET 方法, /api/weather/city/101040100),服务器网站返回 http 响应(JSON 格式);程序解析并展示服务器网站的响应消息(JSON 格式)。代码实现:#coding=utf-8import socketimport js...
要求:
-
基于流(stream)套接字(socket)编写一个客户端(client)程序;
-
程序可连接(connect)某服务器网站(比如:t.weather.sojson.com);
-
程序向服务器网站发送 http 请求(GET 方法, /api/weather/city/101040100),服务器网站返回 http 响应(JSON 格式);
-
程序解析并展示服务器网站的响应消息(JSON 格式)。
代码实现:
#coding=utf-8
import socket
import json
from urllib.parse import quote_plus
# 一个HTTP请求报文由请求行、请求头部、空行、请求数据4部分组成
# 请求行由请求方法字段(GET\POST...)、url字段和HTTP协议版本3个字段组成,以\n分离
request_text = """\
GET /api/weather/city/101040100?address={}&sensor=false HTTP/1.1\r\n\
Host: t.weather.sojson.com:80\r\n\
User-Agent: CQUPT\r\n\
Connection: close\r\n\
\r\n\
"""
def get_weather(address): #获取天气预报的json格式数据段
sock = socket.socket() # 创建socket实例
sock.connect(('t.weather.sojson.com', 80)) # 客户端建立连接
request = request_text.format(quote_plus(address))
sock.sendall(request.encode('ascii')) # 客户端发送消息,encode函数使得HTTP的报文以ASCII码的形势发给服务器
data = b''
while True:
more = sock.recv(4096) # 返回当前任意长度的可读数据,期望长度4096
if not more:
break
data += more
sock.close()
temp = data.decode('utf-8') # 解码
begin = temp.index('{') #找到第一个‘{’开始的位置
end =len(temp) - temp[::-1].index('}') + 1 #找到最后一个‘}’的结束位置,截取json格式的数据段
print('*************************') #输出一条线判断这个函数是否运行成功
return json.loads(temp[begin:end])
def show_weather(weather_data): #展示天气预报
weather_dict = weather_data #先把json转成字典
forecast = weather_dict.get('data').get('forecast') #把后面十五天天气预报存到列表里面
print('城市:', weather_dict.get('cityInfo').get('city')) #用字典的方法输出
print('时间:', weather_dict.get('time'))
print('当前温度:', weather_dict.get('data').get('wendu') + '℃ ')
print('当前湿度:', weather_dict.get('data').get('shidu'))
print('空气质量:', weather_dict.get('data').get('quality'))
print('pm2.5:', weather_dict.get('data').get('pm25'))
print('************************************')
fifteen_day_forecast = input('是否要显示未来十五天天气,是/否:')
if fifteen_day_forecast == '是' or 'YES' or 'yes':
for i in range(15):
print('日期:', forecast[i].get('ymd'),forecast[i].get('week'))
print('天气:', forecast[i].get('type'))
print('温度:', forecast[i].get('high'),forecast[i].get('low'))
print('日出:', forecast[i].get('sunrise'))
print('日落:', forecast[i].get('sunset'))
print('风向:', forecast[i].get('fx'))
print('风力:', forecast[i].get('fl'))
print('温馨提示:',forecast[i].get('notice'))
print('--------------------------')
weather_data = get_weather('重庆')
show_weather(weather_data)
运行结果如下:
后面还有就没有截图了
本文地址:https://blog.csdn.net/bianxia123456/article/details/107160237