代码之家  ›  专栏  ›  技术社区  ›  Andre F.

请求获取方法如何使用

  •  2
  • Andre F.  · 技术社区  · 7 年前

    我使用请求向服务器发送一些数据。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
    

    但是打印(响应url)总是在。。。dyn=变量1。

    1 回复  |  直到 7 年前
        1
  •  0
  •   etene    7 年前

    你的 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 更适合于任意嵌套数据。