【问题标题】:requests get method how to use请求获取方法如何使用
【发布时间】:2026-02-23 11:30:01
【问题描述】:

我使用请求将一些数据发送到服务器。 URL 需要看起来像“http://IP:PORT/api/json/v1/transfer/transferItem?organisation=Organisation&branch=1&itemnumber=1&operation=U&dyn=VARIABLE1=blabla;VARIABLE2=blabla

我使用了以下代码:

def send(self):
    for i in range(1, 8):
        try:
            self.statusBar().showMessage('Connection...')
            resp = requests.get(url,
                params={'organisation': 'Organisation', 'branch': '1', 'itemnumber': str(i), 'operation': 'U', 'dyn': {'VARIABLE1': 'blabla', 'VARIABLE2': 'blabla'} })
            print(resp.url)
            if resp.status_code == requests.codes.ok:
                self.statusBar().showMessage('Finished '+str(i) +' / 7')
                time.sleep(0.5)
        except requests.exceptions.ConnectionError:
            self.statusBar().showMessage('Connection Error')
            break

但是 print(resp.url) 总是在 ...dyn=VARIABLE1 之后结束。

【问题讨论】:

  • 为什么不引用VARIABLE2?这可能不是你想要的。
  • 你是对的,但这根本没有解决问题:/(我编辑我的文字)
  • 我怀疑将嵌套数据作为GET 请求参数传递不会按预期工作。无论如何,这看起来像是 POST 请求的用例。
  • 如果我使用 POST 我从服务器收到错误,因为它是不允许的

标签: python-3.x python-requests urllib3


【解决方案1】:

您的 params 不适合按原样发送 GET 请求,因为它们包含嵌套项 (dyn)。

在这种特殊情况下,您应该以服务器接受的格式单独编码此嵌套项。这会给出类似的东西:

def send(self):
    for i in range(1, 8):
        try:
            self.statusBar().showMessage('Connection...')

            params = {
                'organisation': 'Organisation',
                'branch': '1',
                'itemnumber': str(i),
                'operation': 'U',
                'dyn': {'VARIABLE1': 'blabla', 'VARIABLE2': 'blabla'}
            }
            # Replace the 'dyn' param with a "key1=value1;key2=value2" representation
            params['dyn'] = ";".join("=".join(j) for j in params['dyn'].items())

            # EDIT: Got to encode the parameters ourselves or requests will urlencode them
            params = "&".join("=".join(k) for k in params.items())

            resp = requests.get(url, params)
            print(resp.url)
            if resp.status_code == requests.codes.ok:
                self.statusBar().showMessage('Finished %d / 7' % i)
                time.sleep(0.5)
        except requests.exceptions.ConnectionError:
            self.statusBar().showMessage('Connection Error')
            break

显然我无法测试它,但应该就是这样。如果您有问题,请告诉我。

但是我想强调的是,这在服务器端并不是很好的设计; POST 更适合任意嵌套数据。

【讨论】:

  • 感谢您的帖子,但我有一些问题要将其放入我的代码中,您能否告诉我如何在我发布的代码中实现它:/?提前致谢
  • 这似乎工作近乎完美:) 但是请求库将 = 替换为 %3D; 替换为 %3B 并且服务器无法处理此权利。你知道如何解决这个问题吗?输出看起来像http://IP:PORT/api/json/v1/transfer/transferItem?organisation=Organisation&branch=1&itemnumber=1&operation=U&dyn=VARIABLE1%3Dblabla%3BVARIABLE2%3Dblabla
  • this post 是关于你的新问题。我会更新我的答案,但我鼓励你检查一下。