发送带有数据和 JSON 参数的 post 请求

时间:2020-12-29 17:56:24

标签: python python-requests

我正在尝试发送包含数据和 JSON 字段的 post 请求,例如:

my_df = pd.read_csv('test.csv')
pickled = pickle.dumps(my_df)
pickled_b64 = base64.b64encode(pickled)

my_name = "my_csv_name.csv"

r = requests.post('http://localhost:5003/rcvdf', data = pickled_b64, json= {"name": my_name})

请注意,pickled_b64 的类型为“字节”。

但另一方面,我只得到数据,根本没有 JSON:

@api.route('/rcvdf', methods=['POST'])
def test_1():
    data_pickeled_b64_string = request.data
    json_data = request.json #This is None

甚至可以通过这种方式传递两个变量吗?

--编辑

解决方案

感谢评论,我尝试了不同的方法 - 并通过标头传递变量:

发送方:

my_name = "my_csv.csv"

r = requests.post('http://localhost:5003/rcvdf', data=pickled_b64, headers={"name": my_name})

接收方:

@app.route('/rcvdf', methods=['POST'])
def rcvdf():
    data_pickeled_b64_string = request.data
    name = request.headers['name']

2 个答案:

答案 0 :(得分:2)

func retrieveFromAPI<R: Decodable & CoreDataMappable>(endpoint: Endpoint, object: R.Type) { API.client.call(endpoint, expecting: [R].self) { (result, objects) in //... } } 只是 requests.post(url, json=payload)

的快捷方式 <块引用>

请注意,如果传递数据或文件,将忽略 json 参数。

{{3}}

所以,不,不能同时传递 requests.post(url, data=json.dumps(payload))data 参数。

答案 1 :(得分:1)

另一种方法:

由于 base64 编码具有 ASCI 格式,因此您可以将其转换为简单的字符串对象。

然后你可以通过在你的 json 数据中嵌入你的 pickled_b64 来做到这一点:

import base64, request


pickled_b64 = str(base64.b64encode("hello world".encode()), encoding="utf-8")
json_data = {"Pickled_B64": pickled_b64, "Name": "my_csv_name.csv"}
send_request = requests.post('http://localhost:5003/rcvdf', json=json_data)
print(send_request.json())

在您的后端:

from flask import make_response, jsonify

@api.route('/rcvdf', methods=['POST'])
def test_1():
    pickled_b64 = request.json.get('Pickled_B64', None)
    name = request.json.get('Name', None)
    reserve_dict = {"Status": "Got it", "name": name, "pickled_b64": pickled_b64}
    reserve_response = make_response(jsonify(reserve_dict), 200)
    return reserve_response