Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python请求,我可以添加;“数据”;准备好的请求?_Python_Python Requests - Fatal编程技术网

使用Python请求,我可以添加;“数据”;准备好的请求?

使用Python请求,我可以添加;“数据”;准备好的请求?,python,python-requests,Python,Python Requests,下面的代码设置\u请求如果HTTP方法是GET,那么它有一个if语句来处理PUTPOST和PATCH 我正在尝试为所有方法类型使用一个单独的请求设置语句 这可能吗?在我看来,似乎没有办法向准备好的请求中添加数据,如果这是真的,那么我可能需要两种不同的方法来设置请求,一种是GET,另一种是PUT,PATCH和POST def fetch_from_api(self): s = Session() headers = { "Authorization" : REST_

下面的代码设置
\u请求
如果HTTP方法是
GET
,那么它有一个
if
语句来处理
PUT
POST
PATCH

我正在尝试为所有方法类型使用一个单独的请求设置语句

这可能吗?在我看来,似乎没有办法向准备好的请求中添加
数据
,如果这是真的,那么我可能需要两种不同的方法来设置请求,一种是
GET
,另一种是
PUT
PATCH
POST

def fetch_from_api(self):
        s = Session()
        headers = { "Authorization" : REST_API_AUTHORIZATION_HEADER}
        _request = Request(self.method, self.url_for_api, headers=headers)

        if self.method in ['POST', 'PATCH', 'PUT']:
            headers['content-type'] = 'application/x-www-form-urlencoded'
            _request = Request(self.method, self.url_for_api, headers=headers, data=self.postdata)

        prepped = _request.prepare()
        self.api_response = s.send(prepped)

如果查看
requests.Request
,您似乎可以根据需要设置
data
属性:

some_request = Request(method, url, headers=headers)
if # ...we decide we need to add data:
    some_request.data = data
从模型上看,这似乎是可行的,因为稍后,当您查看实例的
数据
属性时

编辑

但仔细阅读您的问题,您似乎想向
准备好的请求添加数据。我想你可以创建自己的
准备好的请求
,但我不知道这有什么帮助?似乎您只想分支,也许添加数据,也许不添加

无论如何,上面的内容似乎可以将代码稍微简化为以下内容:

 def fetch_from_api(self):
    s = Session()
    headers = { "Authorization" : REST_API_AUTHORIZATION_HEADER}
    _request = Request(self.method, self.url_for_api, headers=headers)
    if self.method in ['POST', 'PATCH', 'PUT']:
        headers['content-type'] = 'application/x-www-form-urlencoded'
        _request.data = self.postdata
    prepped = _request.prepare()
    self.api_response = s.send(prepped)
(但对我来说,这看起来并不简单。我们想要实现什么?而且,有一个名为
fetch\u from\u api
的方法似乎很奇怪,它也可以是
POST
ing或
PUT
ing数据。作为一个开发人员,我不希望从名称上看到这种情况。)

在过去,由于必须对请求进行签名,我做过这样的事情:我必须在一个地方创建请求,然后将它们交给一个知道如何创建签名的类,然后由该类返回。换句话说,您当然可以在准备和发送请求之前编辑请求


无论如何,我没有尝试过这些,但它与我过去在请求方面所做的一些事情类似,因此它看起来是合法的,但我会关心您试图实现的目标,以及是否有东西被塞满在一起,而这可能是不应该的。

我正在使用HTTPforHumans,requests模块

import requests

def pv_request(url, methods, data=None, headers=None, type=None):

    try:
        if 'POST' in methods:
            return requests.post(url=url, headers=headers, data=data).json()

        elif 'GET' in methods:
            return requests.get(url=url, headers=headers, data=data).json()

        elif 'PUT' in methods:
            if type == 'music':
                return requests.put(url=url, headers=headers, data=data).json()

            elif type == 'image':
                return requests.put(url=url, headers=headers, data=open(data, 'rb')).json()
    except requests.exceptions.ConnectionError:
        return None

可能不符合您要查找的内容,但这是我的专用请求处理程序

这个问题有点老了,希望@DukeDougal已经有了解决方案。也许这会帮助其他人

在这个示例中,我注意到的第一件事是在方法的开头附近创建了一个
Request
对象。然后,如果方法是“POST”、“PATCH”或“PUT”,则再次调用
请求
构造函数,以获取另一个对象。在这种情况下,第一个对象消失了。这是不必要的

data=
参数未提供给
请求
构造函数时,它与指定
data=None
相同。利用这一点,只调用构造函数一次,则无需向现有的
请求
(或
PreparedRequest
)对象添加
数据
值:


我试图避免if语句中重复的代码。我只是想使用相同的代码集发送请求,并尝试避免重复。带有请求的GET请求仅在方法中有所不同,即具有“数据”参数。我认为我应该能够使用一行代码来设置请求,并且仅当它不是GET请求时才添加“数据”。好吧,如果您考虑一个实际的HTTP请求,它有
。它对您的
数据一无所知。这就是为什么,当您查找
请求的源代码时,您可以在
prepare
具有
主体但没有
数据的
之后看到
prepared\u请求。就我个人而言,我可能会为GETs编写一个函数,然后再编写另一个函数,因为它对局外人来说更为明显。
def fetch_from_api(self):
    s = Session()
    headers = {'Authorization': REST_API_AUTHORIZATION_HEADER}
    data = None  # Assume no data until method is checked

    if self.method in ['POST', 'PATCH', 'PUT']:
        headers['content-type'] = 'application/x-www-form-urlencoded'
        data = self.postdata  # Add the data

    # Now headers and data are ready, get a Request object
    _request = Request(self.method, self.url_for_api, headers=headers, data=data)

    prepped = _request.prepare()
    self.api_response = s.send(prepped)