如何使用http.client for API

问题描述

我正在尝试使用Bing的实体搜索API,但是我需要通过代理才能建立连接。

我的公司给我提供了以下格式的代理:'http:// username:password@webproxy.subdomain.website.com:8080'

我尝试使用httpconnection.set_tunnel(host,port = None,headers = None)无济于事。有谁知道如何使用提供的代理在下面运行以下Python查询

import http.client,urllib.parse
import json


proxy = 'http://username:pwd@webproxy.subdomain.website.com:8080' 
subscriptionKey = 'MY_KEY_HERE'
host = 'api.cognitive.microsoft.com'
path = '/bing/v7.0/entities'
mkt = 'en-US'
query = 'italian restaurants near me'

params = '?mkt=' + mkt + '&q=' + urllib.parse.quote (query)

def get_suggestions ():
    headers = {'Ocp-Apim-Subscription-Key': subscriptionKey}
    conn = http.client.HTTPSConnection(host)
    conn.request("GET",path + params,None,headers)
    response = conn.getresponse()
    return response.read()

result = get_suggestions ()
print (json.dumps(json.loads(result),indent=4))

作为旁注,我能够使用代理成功运行以下内容

nltk.set_proxy('http://username:pwd@webproxy.subdomain.website.com:8080')
nltk.download('wordnet')

解决方法

我最终使用了请求包,它们使通过代理引导您的请求变得非常简单,下面的示例代码可供参考:

    import requests

     proxies = {
    'http':  f"http://username:pwd@webproxy.subdomain.website.com:8080",'https': f"https://username:pwd@webproxy.subdomain.website.com:8080"
         }
    url = 'https://api.cognitive.microsoft.com/bing/v7.0/entities/'
    # query string parameters
    
   
    params = 'mkt=' + 'en-US' + '&q=' + urllib.parse.quote (query)

    
    # custom headers
    headers = {'Ocp-Apim-Subscription-Key': subscriptionKey}
    
    #start session
    session = requests.Session()
    #persist proxy across request
    session.proxies = proxies

    # make GET request
    r = session.get(url,params=params,headers=headers)




,

如果您使用urlib2或请求,配置代理的最简单方法是设置HTTP_PROXY或HTTPS_PROXY环境变量:

export HTTPS_PROXY=https://user:pass@host:port

通过这种方式,库可以为您处理代理配置,并且如果您的代码在容器中运行,则可以在运行时传递该信息。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...