首页 > 解决方案 > 如何在python中为请求的响应添加额外的键、值

问题描述

我需要在requestspython3 的 lib 中添加一些额外的键和值来响应,而不改变响应结构(因为响应将被发送到另一个服务的进程)。例如,我收到了这样的回复:

>>import requests
>>r = requests.post(url=input_kong_address, data=data)
>>print(r.json())
{
    "foo":"bar",
    "key1":"val1"
}

我需要添加"extra_key":"extra_value"响应:

{
    "foo":"bar",
    "key1":"val1",
    "extra_key":"extra_value"
}

现在我想添加一些额外的响应键并将其发送到下一个服务而不改变结构(类、类型等):

>>import requests
>>import json
>>r = requests.post(url=input_kong_address, data=data)
>>response_data = r.json()
>>response_data['extra_key']='extra_value'  # trying to add extra key and value to response
>>r.json = json.loads(json.dumps(response_data))  #  trying to attach new dict to response
>>r.json() # check is worked?
{TypeError}'dict' object is not callable

谢谢你。

标签: pythonjsonpython-requests

解决方案


response.json()是一种方法,因此将其重新绑定到 dict 确实只会导致这种行为。现在,如果您阅读响应类的源代码,您会发现该方法实际上对._content属性进行了操作(通过.contentand/or.text属性访问)。IOW,您只需将序列化的 json 字符串分配给response._content

>>> import requests
>>> import json
>>> r = requests.get("https://www.google.com")
>>> r._content = json.dumps({"foo": "bar"})
>>> r.json()
{u'foo': u'bar'}
>>> 

话虽如此:

响应将被发送到该进程的另一个服务

那么你可能需要对你的设计三思而后行。如果不了解更多关于您的具体用例,当然不可能说出来,但是问问自己这个“其他服务”是否真的需要整个响应对象。


推荐阅读