Python中用Request实现HTTP请求(data、json、file、headers、timeout)

系统的介绍Request使用方式有些复杂,下面集中我最常用的情况,可以让你快速了解request.post常见用法

headers={'content-type': 'application/json;charset=UTF-8'}
header = {'content-type': 'application/json', 'authorization': 'serial_num'}

files = {file: open('test.png','rb')}
#自定义文件名,文件类型、请求头
 files = {'oriImg': ('test.png',open('test.png','rb'),'image/png'))}
response = requests.post(url, files=files, headers=header,timeout=3)
response = requests.post(url, data=str(send_data).encode('utf-8'), headers=header,timeout=4)

1、服务端通常是根据请求头(headers)中的 (Content-Type )字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。‘content-type’: ‘application/json’告诉服务端消息主体是序列化后的 JSON 字符串。我一般在python中都这么用。
2、服务端通常是根据请求头(headers)中的(authorization)主要用作http协议的认证.
3、timeout=3,这个值是作为 connect 和 read 二者共用的 timeout ,可以写成timeout=(4,3)内第一个值为连接超时时间,第二个值为读取超时时间.
4、传送数据内容可以是file,json,data,file注释里面已经写明用法了,下面介绍一下json和data
data与json既可以是str类型,也可以是dict类型。
4.1、不管json是str还是dict,如果不指定headers中的content-type,默认为application/json
4.2、data为dict时,如果不指定content-type,默认为application/x-www-form-urlencoded,相当于普通form表单提交的形式
4.3、data为str时,如果不指定content-type,默认为text/plain
4.4、用data参数提交数据时,request.body的内容则为a=1&b=2的这种形式,用json参数提交数据时,request.body的内容则为’{“a”: 1, “b”: 2}'的这种形式
这些是网上的解释,我一般使用都是data=str(send_data).encode(‘utf-8’),data=字典转为字符串
client客户端代码

import requests
import json
senddata = {}
senddata['flag'] = 1
senddata['content'] = 'mm'
resp = requests.post("http://localhost:5000",data=str(senddata).encode('utf-8'), headers={'content-type': 'application/json'})
print(json.loads(resp.text)['result'])

server服务端代码

from flask import Flask, jsonify, request
import json
import sys
app = Flask(__name__)
#predict是对客户端的不同请求的命名,也可以是get_data,print,save等等
@app.route('/',methods = ['POST'])
def predict():
    if request.method == 'POST':
        data=request.data
        print(data)
        dict_res=eval(data.decode())
        print(dict_res)
        return jsonify({'result': ' GOT RESULT'})
if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000)

client客户端代码发送form-data,注意这里有个特别重要的问题,
就是无论发送失败或者成功,文件缓存被清空,需要重新加载

import requests
import time
def send():

    data={}
    data['diameter'] = '28'
    files = [
        ('originalImg', ('1.jpeg', open('1.jpeg', 'rb'), 'image/jpeg')),
        ('measureImg', ('2.jpeg', open('1.jpeg', 'rb'), 'image/jpeg'))
    ]
    try:
        url = 'http://127.0.0.1:5000'
        print(data)
        resp = requests.post(url, data=data, files=files)
        #无论发送失败或者成功,文件缓存被清空,需要重新加载
        # time.sleep(4)
        # files = [
        #     ('originalImg', ('1.jpeg', open('1.jpeg', 'rb'), 'image/jpeg')),
        #     ('measureImg', ('2.jpeg', open('1.jpeg', 'rb'), 'image/jpeg'))
        # ]
        #resp = requests.post(url, data=data, files=files)
        jsonResult = resp.json()
        print(jsonResult)
    except Exception as error:
        print(error)
        url = 'http://127.0.0.1:5008'
    pass
send()

server服务端代码接收form-data


from flask import Flask, jsonify, request
import json
import sys
app = Flask(__name__)
#predict是对客户端的不同请求的命名,也可以是get_data,print,save等等
@app.route('/',methods = ['POST'])
# @app.route('/',methods = ['POST'])
def predict():
    if request.method == 'POST':

        data=request.form.get('diameter')
        print(data)
        file = request.files.get('measureImg')
        file.save("file1.jpg")
        print(file)

        return jsonify({'result': ' GOT RESULT'})
if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000)

你可能感兴趣的:(python学习,python,开发语言,flask)