python http应用

来源:互联网 发布:手机安全防护软件 编辑:程序博客网 时间:2024/06/14 08:25

1、使用代理
>>> import urllib.request
>>> proxies = {'http': 'http://proxy.example.com:8080/'}
>>> opener = urllib.request.FancyURLopener(proxies)
>>> opener.addhead("Accept", "sound/basic")
>>> f = opener.open("http://www.python.org")
>>> f.read().decode('utf-8')

2、GET请求

import urllib.request
f = urllib.request.urlopen('http://www.pcb.org/pcb?a=b&c=d')
dir(f)

import urllib.request
req = urllib.request.Request('http://www.example.com/')
req.add_header('Referer', 'http://www.python.org/')
r = urllib.request.urlopen(req)
对于GET请求,已经完备了

3、POST请求
import http.client, urllib.parse
params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
headers = {"Content-type": "application/x-www-form-urlencoded",
           "Accept": "text/plain"}
conn = http.client.HTTPConnection("musi-cal.mojam.com:80")
conn.request("POST", "/cgi-bin/query", params, headers)
response = conn.getresponse()

请求包是这样:
POST /cgi-bin/query HTTP/1.1
Host: musi-cal.mojam.com
Accept-Encoding: identity
Content-Length: 21
Content-type: application/x-www-form-urlencoded
Accept: text/plain

eggs=2&bacon=0&spam=1


自由添加body:
headers = {"Content-type": "application/x-www-form-urlencoded",
           "Accept": "text/plain"}
conn = http.client.HTTPConnection("musi-cal.mojam.com:80")
conn.request("POST", "/cgi-bin/query", “a=c&c=d\np=f”, headers)

另一种格式:
conn = http.client.HTTPConnection("aos.isd.com")
header = {"Content-Type":"multipart/form-data; boundary=123456789"}
content = """--123456789
Content-Disposition: form-data; name=value1

versionList
--123456789
Content-Disposition: form-data; name=value2

7792
--123456789--
"""
conn.request("POST", "/cc2/cc/ccInterface.api.php", content, header)

==========================================================

multipart/form-data方式 ( RFC1867 ) HTTP协议大致如下,红色是额外加上的:

POST /msb/WebForm1.aspx HTTP/1.1
Connection: Keep-Alive
Content-Length: 458
Content-Type: multipart/form-data; boundary=-----------------------------7d6bb34502ce[上传方式,边界]
Accept: */*
Expect: 100-continue
Host: localhost
Referer: http://mtv.1ting.com/
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)

-------------------------------7d6bb34502ce[边界这里开头多了2个中划线]
Content-Disposition: form-data; name="key1[表单域名]"

ffffffffffffffffffffffffffffffffffffffffffffffffffffff[表单域值]
-------------------------------7d6bb34502ce[边界这里开头多了2个中划线]
Content-Disposition: form-data; name="file[文件类型表单域名]"; filename="d:\1.rar[文件名]"
Content-Type: application/x-msdownload[文件类型]

[文件内容]
-------------------------------7d6bb34502ce--[最后一个边界,开头和结尾都多了2个中划线




---------------------------------------------------------

import http.client, urllib.parse



def buidcontent(boundary):
    jsonObject = '''{
        "appkey" : "y6Vrn2xQvq",
        "sealType" : 1,
        "docName" : "test.pdf",
        "rules" : [
            {
                "type" : 1,
                "signetId" : "87b1ec0f-38f6-47ea-8e47-7f001b4ed657",
                "offset" : [1668, 2828],
                "page" : 0
            }
            ]
        }'''
    content = '--' + boundary 
    content += "\r\n"
    content += 'Content-Disposition: form-data; name="json"'
    content += "\r\n"
    content += 'Content-Type: text/plain;charset=UTF-8'
    content += "\r\n\r\n"
    content += jsonObject
    content += "\r\n\r\n" 
    
    content += '--' + boundary
    content += "\r\n"
    content += 'Content-Disposition: form-data; name="file";filename="%s"' % "test.pdf"
    content += "\r\n"
    content += 'Content-Type: application/octet-stream'
    content += "\r\n"
    content += 'Content-Transfer-Encoding: binary'
    content += "\r\n\r\n"
    content = content.encode("utf-8")
    fd = open("dzqz.pdf", 'rb')    

    content += fd.read()

    fd.close()
    content += b"\r\n\r\n"
    end = '--' + boundary + "--\r\n"

    end = end.encode("utf-8")
    content += end
    
    return content
        


def testDzqz():
    conn = http.client.HTTPConnection("10.123.25.22:8080")
    boundary = "dzqz"
    header = {"Content-Type" : "multipart/form-data; boundary=%s" % boundary}    
    content = buidcontent(boundary)
    conn.request("POST", "/smp/gateway/signature", content, header)
    response = conn.getresponse()
    print(response.code)
    print(response.headers)
    print(response.read().decode('utf8'))
    
if __name__ == "__main__":
    testDzqz()
原创粉丝点击