python3发送https请求_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",
"Authorization": "Basic: someValue",
"Content-Type": r"application/json",delphi反编译三剑客工具
"Connection": "keep-alive",
"Proxy-Connection": "keep-alive",
"Cookie": "xxxxxxxxx(备注:这⾥的具体值请⾃⾏填写,其他key对应的值也是⼀样)",
"User-Agent": "360xxxxxx(备注:这⾥的信息也请⾃⾏抓到之后填写,不需要的话,可以不⽤填写)"
}
针对正式环境和测试环境需要设置url的地址,以及Header的"Host"中的具体域名的⽅法如下:
原因:因为⼀个IP地址对应的服务器上可能会有多个域名,因为可能会上多个不同业务的服务器代码,如此会有⼀个默认的域名,但是并不⼀定是你的这个业务对应的域名,所以⼀定要在headers中的"HOST"中指定域名才可以到这个域名,从⽽到其对应的接⼝,进⾏正确的调⽤。
cookie信息都是在headers⾥⾯的"Cookie"键对应的value后⾯,这个可以通过⽇志或者抓包得到,注
意,抓到的信息⼀定要原封不动的全部拿来⽤。
另外,这个cookie信息也可以通过其他⽅式获取,⽐如说,通过登录接⼝拿到cookie信息,再将cookie信息设置到后续需要的"Cookie"中。
具体的body的值,需要跟服务器端开发对应⼀下数据的加密⽅式,⽬前⽐较多的都是通过json格式的,需要确认的是⼏层json,⽐如我们的开发同学搞了两层json,导致我刚开始的时候就在最外⾯搞了⼀层json转换格式,结果请求的时候⼀直提⽰Resopnse 200,但是返回的errorMsg⼀直是错误请求。(备注:⾸先需要确认Response的Status是200的话,就说明已经跟服务器端连接上了,然后如果拿不到正确的数据,那就要分析是你的数据传送格式不正确,还是缺少了哪些内容,导致服务器端解析不出,或者⽆法给出你想要的内容)
备注1:需要了解⼀下get请求在服务器端是怎么处理的?post请求在服务器端⼜是如何处理的?这个需要另开⼀篇博客专门写⼀下。
备注2:关于编码⽅式,以及⼏种编码⽅式的转换(编码解码等),进⾏urlencode的具体⽅法,在python26的urllib中有urlencode⽅法,只能对dict进⾏编码,如果只是对字符串进⾏编码,需要使⽤urllib.quote()⽅法
python请求并解析json数据⽐如:
>>> import urllib
>>> xx = {'kw': '达达'}
>>> urllib.urlencode(xx)
'kw=%B4%EF%B4%EF'
>>> ss =
File "", line 1
ss =
^
SyntaxError: invalid syntax
>>>
>>> ss = '达达'
>>> urllib.urlencode(ss)
Traceback (most recent call last):
File "", line 1, in
File "C:\Python26\lib\urllib.py", line 1255, in urlencode
raise TypeError
TypeError: not a valid non-string sequence or mapping object
>>> urllib.quote(ss)
'%B4%EF%B4%EF'
查看当前处于什么编码格式:
>>> import sys
>>> defaultencoding()
'ascii'
编码及解码:
在python中使⽤decode和encode进⾏编码和解码,⽐如我们get到的str类型是gbk的,那就可以str.decode(''gbk'),之后再encode成我们想要的格式
⼀般情况下常⽤的编码格式主要有:utf8、gbk、gb2312;在python26中默认的编码是ascii,但是在python3.x中默认的编码是utf-8
后⾯再专门针对编码这块做⼀个⼤块的总结。
2、http请求端⼝、cookie,以及实现具体的get和post请求
http请求端⼝默认是80,如果不指定的话,默认⾛的就是80,否则就需要指定服务器端指定listen的端⼝。
(1)httplib库——HTTP protocol client
切记:要从⽤户⼿册中学习!
httplib在python3.0中已经更名为http.client了。
class httplib.HTTPConnection(host[,port[,strict[,timeout]]])
class httplib.HTTPSConnection(host[,port[,key_file[,cert_file[,strict[,timeout]]]]]) ——这是HTTPConnection的⼀个⼦类,使⽤了SSL,⽤来跟安全服务器进⾏通信。默认的端⼝是443。key_file是⼀个pem格式的包含了密钥的⽂件,cert_file是⼀个pem格式的证书链⽂件。
然后这个httplib的HttpConnection的类调⽤之后,能够得到⼀个HTTPConnection的instance,就是⼀个HTTPConnection或者HTTPSConnection的⼀个对象,⽐如设置其名称为conn,之后利⽤这个conn的对象就可以继续⾛
request(method,url[,body[,headers]])的请求,调⽤request⽅法之后,继续调⽤sponse(),然后返回⼀个HTTPResponse 的实例对象,例如为res,然后调⽤headers()⽅法获取response的头部,得到的⼀个(header,value)的tuple,通过res.status就可以得到状态(200为OK,连接上的含义),ad()就可以得到response的body信息,然后⾃⼰再针对body信息的类型,⽐如是json,就解析出来显⽰即可。
具体的使⽤例⼦⽤户⼿册中也说明了:nba:爵士队险胜太阳队
>>> import httplib
>>> conn = httplib.HTTPConnection("")
>>> quest("GET", "/index.html")
>>> r1 = sponse()
>>> print r1.status, r1.reason
301 Moved Permanently
>>> quest("GET", "/parrot.spam")
>>> r2 = sponse()
>>> print r2.status, r2.reason
301 Moved Permanently
>>> conn2 = httplib.HTTPConnection("jia.360")
>>> quest("GET", "/standard.html")
>>> r3 = sponse()
>>> print r3.status
200
>>> data = r3.read()
>>> print data
以上例⼦中,先⽤的是⽤户⼿册的example中的例⼦,但是因为被永久转移,所以返回的结果如上;所以选择
了"jia.360"的url,之后request中请求的是标准版摄像机的页⾯,即"/standard.html",之后就能够得到r3的结果,为200,说明连接OK了,之后就能通过r3.read()得到body的内容,通过r3.getheaders()就能获取到header的内容。知网后缀php用什么打开
以上都是request⽅法中都是"GET"⽅法,换成"POST"需要传的内容会有⼀些差别,如下:
>>> import httplib, urllib
>>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> headers = {"Content-type": "application/x-www-form-urlencoded",
... "Accept": "text/plain"}
>>> conn = httplib.HTTPConnection("jam:80")
>>> quest("POST", "/cgi-bin/query", params, headers)
>>> response = sponse()
>>> print response.status, ason
200 OK
>>> data = ad()
>>> conn.close()
备注:以上代码也是运⾏不通过的,因为是⽐较久远的python版本的例⼦,主要需要注意的是:需要⾃⼰设置headers,在其中根据需要传递Cookie、Content-Type、Accept等信息,通过key-value的形式传递,具体的body中传递的信息,要注意是json格式的,还是通过urlencode编码等,格式⼀定要跟开发沟通清楚,否则会有错误请求的问题,之后得到response,并获取response的status、body、headers就与前⾯的"GET"method⼀样了。
(2)request库
get请求:
>>> r = ('/get')
>>> r
>>> r.text
u'{\n "args": {}, \n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Host": "", \n "User-Agent": "python-requests/2.9.1"\n }, \n "origin": "218.30
.116.9", \n "url": "/get"\n}\n'
考研c语言用什么软件post请求:
>>> r = requests.post('/post', data={'key':'value'})
>>> r
>>> r.text
u'{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {\n "key": "value"\n }, \n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Content-Length": "9"
, \n "Content-Type": "application/x-www-form-urlencoded", \n "Host": "", \n "User-Agent": "python-
requests/2.9.1"\n }, \n "json": null, \n "origin": "218.30.116.185", \n "url":
"/post"\n}\n'
我这⾥⽤的还是httplib的,request的后续有详细使⽤教程会补充上来。
⼆、https请求
1、https的请求⽅式:get和post
http和https的区别:
(2)因为有ssl的认证和加密,所以具体的底层的通信过程中会有不同,https的这⼀层在建⽴连接的时候,需要设置socket属性,socket属性的⽣成需要使⽤具体的⽅法调⽤,⽅法调⽤的参数需要指定:ca_certs=服务器端给提供的公钥证书即可。
然后如果还有客户端认证的话,那客户端也可以提供出⾃⼰的key_file,cert_file。
什么是ssl?
ssl的全称是(Secure Sockets Layer)安全套接层,另外还有TLS(Transport Layer Secure,传输层安全),这两种协议都是为⽹络提供安全和数据完整性的⼀种安全协议,在传输层对⽹络连接进⾏加密。
为什么要⽤这个?
防⽌数据以及⽹络连接的传输内容被截获,所以涉及到个⼈或者重要的信息等,都需要进⾏建⽴ssl连接,通过https的请求⽅式加密处理。
2、https请求端⼝、ssl建⽴,以及实现具体的get和post请求
post请求:
httpsConn = None
try:
httpsConn = httplib.HTTPSConnection(host)
sock = ate_connection((httpsConn.host, httpsConn.port))
try:
httpsConn.sock = ssl.wrap_socket(sock, ca_certs=CERT_FILE, cert_reqs=ssl.CERT_REQUIRED,
ssl_version=ssl.PROTOCOL_SSLv3)
#self.sock = ssl.wrap_socket(sock, self.key_file, _file, ssl_version=ssl.PROTOCOL_SSLv3) except ssl.SSLError, e:
print("Trying SSLv3.")
try:
httpsConn.sock = ssl.wrap_socket(sock, ca_certs=CERT_FILE, cert_reqs=ssl.CERT_REQUIRED,
ssl_version=ssl.PROTOCOL_SSLv23)
#self.sock = ssl.wrap_socket(sock, self.key_file, _file, ssl_version=ssl.PROTOCOL_SSLv23) except ssl.SSLError, e:
print("Trying SSLv23.")
try:
httpsConn.sock = ssl.wrap_socket(sock, ca_certs=CERT_FILE, cert_reqs=ssl.CERT_REQUIRED,
ssl_version=ssl.PROTOCOL_TLSv1)
except ssl.SSLError, e:
print("Trying TLSv1.")
try:
httpsConn.sock = ssl.wrap_socket(sock, ca_certs=CERT_FILE, cert_reqs=ssl.CERT_REQUIRED,
ssl_version=ssl.PROTOCOL_SSLv2)
except ssl.SSLError, e:
print("Trying SSLv2.")
res = sponse()
headers = {}
for k, v headers():
headers[k] = v
return res.status, headers, ad()
except Exception, e:
import traceback
print traceback.format_exc()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论