python 请求服务器的实现代码请求服务器的实现代码(http请求和请求和https请求请求)
一、一、http请求请求
1、、http请求方式:请求方式:get和和post
get一般用于获取/查询资源信息,在浏览器中直接输入url+请求参数点击enter之后连接成功服务器就能获取到的内容,post请
求一般用于更新资源,通过form表单或者json、xml等其他形式提交给服务器端,然后等待服务器端给返回一个结果的方式
(这个返回结果一般就是被修改之后的是否成功的状态,或者是修改后的最新数据table等)。
http请求,不论是get还是post请求,都会包含几个部分,分别是header,cookie,get会有param,post会有body。
这个可以通过fiddler里面抓包就可以拿到需要的Headers,一般需要设置的值可能有:
header = {
"Host": "x.x.360.cn",
"Authorization": "Basic: someValue",
"Content-Type": r"application/json",
"Connection": "keep-alive",
"Proxy-Connection": "keep-alive",
"Cookie": "xxxxxxxxx(备注:这里的具体值请自行填写,其他key对应的值也是一样)",
"User-Agent": "360xxxxxx(备注:这里的信息也请自行抓到之后填写,不需要的话,可以不用填写)"
}
针对正式环境和测试环境需要设置url的地址,以及Header的”Host”中的具体域名的方法如下:
(1)正式环境:url中的host也设置成域名,比如:http://%s/search/searchList的%s就替换成 域名,在headers中
的”HOST”的键对应的value也是域名,比如说都是”x.y.360.cn”
(2)测试环境: url中的host设置成具体的IP,比如:http://%s/search/searchList的%s就替换成 10.108.225.234这样的具体
IP(备注,这个IP就是你们平时开发上测试代码的机器),但是headers中的”HOST”的键对应的value必须得写成域名,比
如”x.y.360.cn”
原因:因为一个IP地址对应的服务器上可能会有多个域名,因为可能会上多个不同业务的服务器代码,如此会有一个默认的域
名,但是并不一定是你的这个业务对应的域名,所以一定要在headers中的”HOST”中指定域名才可以找到这个域名,从而找
到其对应的接口,进行正确的调用。
进一步,对于一个IP地址对应的服务器,其上会有很多域名,这个是如何部署的呢?需要问一下服务器端的同学,比如说会有
x.360.cn和x.y.360.cn,这个是如何进行配置的呢?具体原因是使用了nginx的配置://www.jb51.net/article/140826.htm;具体
的内容就是指:一台nginx服务器多域名配置,然后客户端请求的时候,就能自动根据这个host找到对应的文件目录,然后找
到对应处理方法,这个后续要再详细了解一下。
cookie信息都是在headers里面的”Cookie”键对应的value后面,这个可以通过日志或者抓包得到,注意,抓到的信息一定要原
封不动的全部拿来用。
另外,这个cookie信息也可以通过其他方式获取,比如说,通过登录接口拿到cookie信息,再将cookie信息设置到后续需要
的”Cookie”中。
具体的body的值,需要跟服务器端开发对应一下数据的加密方式,目前比较多的都是通过json格式的,需要确认的是几层
json,比如我们的开发同学搞了两层json,导致我刚开始的时候就在最外面搞了一层json转换格式,结果请求的时候一直提示
Resopnse 200,但是返回的errorMsg一直是错误请求。(备注:首先需要确认Response的Status是200的话,就说明已经跟
服务器端连接上了,然后如果拿不到正确的数据,那就要分析是你的数据传送格式不正确,还是缺少了哪些内容,导致服务器
端解析不出,或者无法给出你想要的内容)
一般的get请求的格式,一个参数的可能是这样的:http://xxx/search/YYYY?&kw=123456789,如果是多个参数的话:
http://music.baidu.com/search?fr=ps&ie=utf-8&key=%E7%9C%8B%E8%A7%81%E4%BA%86,比如像百度音乐的这个url,
在?后面都可以添加一个&,然后url其实也可以变成这样的格式:http://music.baidu.com/search?&fr=ps&ie=utf-
8&key=%E7%9C%8B%E8%A7%81%E4%BA%86,但是实际上访问get到的都是相同的内容,也就是说服务器端解析的时
候,返回的结果都是相同的内容;多个参数,就每个参数之间加一个&链接起来,但是注意,有些值传的时候可能需要进行
urlencode编码,并且一定要在跟服务器端相同的编码的基础上进行urlencode编码(我自己碰到的坑:我的python程序用的编
码方式是:gbk,我们服务器端的编码方式是utf-8,我最开始的时候,直接对中文进行了urlencode编码,但是得到的结果不是
想要的,最后才发现原来我urlencode之后的码与服务器端urlencode之后的码不同,所以当然解不出了,那么就
decode(‘gbk’).encode(‘utf-8’),然后得到的内容再urlencode,之后才正确。。。所以都是坑)
备注1:需要了解一下get请求在服务器端是怎么处理的?post请求在服务器端又是如何处理的?这个需要另开一篇博客专门写
一下。
备注2:关于编码方式,以及几种编码方式的转换(编码解码等),进行urlencode的具体方法,在python26的urllib中有
urlencode方法,只能对dict进行编码,如果只是对字符串进行编码,需要使用urllib.quote()方法
比如:
评论0
最新资源