首页 > 解决方案 > HTTPError:对 Python urllib 的错误请求

问题描述

这是我第一个使用 API/python 的项目。基本上,我想从 trackhive.com 获取信息以查看包裹在哪里。但首先,要了解它是如何工作的,我只是想创建一个轨道。

在网站上,他们给了我这个例子:

from urllib2 import Request, urlopen

values = """
  {
    "tracking_number": "9361289676090919095393",
    "slug": "usps"
  }
"""

headers = {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer Token'
}
request = Request('https://private-anon-6175dd5596-trackhive.apiary-proxy.com/trackings
', data=values, headers=headers)

response_body = urlopen(request).read()

当我使用 Python 3 时,我的代码是

import json
import urllib.request

values = """
  {
    "tracking_number": "9361289676090919095393",
    "slug": "usps"
  }
"""

headers = {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer mytokenAPI'
}

url = 'https://private-anon-6175dd5596-trackhive.apiary-proxy.com/trackings'
request = urllib.request.Request(url,data=values, headers=headers)

response_body = urllib.request.urlopen(request, data=bytes(json.dumps(headers), encoding="utf-8")).read()

但是当它调用“urllib.request.urlopen”时,它会返回“HTTPError: Bad Request”。我究竟做错了什么?

在网站上,他们说端点位于:https ://api.trackinghive.com 。在他们的代码中,他们正在访问:“https://private-anon-6175dd5596-trackhive.apiary-proxy.com/trackings”。如果我没有访问他们的示例,我怎么知道我想访问这个 URL,而不是像“https://api.trackinghive.com/trackings”这样的东西?不是假设在某处使用端点吗?

(对于所有这些问题,我很抱歉,我对这些带有 API 和 URL 的代码如何工作感到有些困惑)

我感谢任何帮助^^

编辑:

文档链接: https ://trackhive.docs.apiary.io/#introduction/api-requirements/end-point

标签: pythonurllib

解决方案


如果我在https://my.trackinghive.com/login上注册并生成,API key那么代码对我有用。


我使用requests而不是urllib因为它更容易创建POST请求。并且文件显示它必须是POST,不是GET

并且更容易发送JSON数据。它不需要标题Content-Type': 'application/json',因为requests在使用时会自动添加它json=...。而且它不需要转换values为一个字符串,因为requests它会自动完成。

顺便说一句:我不需要模块json来处理数据。我只使用它来将其转换为带有缩进的字符串以显示它。

import requests
    
values = {
   "tracking_number": "9361289676090919095393",
   "slug": "usps"
}

token = 'eyJh....'

headers = {
  'Authorization': f'Bearer {token}'  # both works for me
  #'Authorization': f'{token}'
}

url = 'https://api.trackinghive.com/trackings'

r = requests.post(url, headers=headers, json=values)

print('\n--- as text ---\n')
print(r.text)
print()

print('\n--- as dict/list ---\n')

data = r.json()
print('keys:', list(data.keys()))

print('message:', data["meta"]["message"][0])

# - show it more readable -

print('\n--- more readable ---\n')

import json

text = json.dumps(data, indent=2)
print(text)

结果:

--- as text ---

{"meta":{"code":409,"message":["Tracking already exists."]},"data":{"_id":"60a5b5a0aa4e400011a0c657","current_status":"Pending","return_to_sender":false}}


--- as dict/list ---

keys: ['meta', 'data']
messge: Tracking already exists.

--- more readable ---

{
  "meta": {
    "code": 409,
    "message": [
      "Tracking already exists."
    ]
  },
  "data": {
    "_id": "60a5b5a0aa4e400011a0c657",
    "current_status": "Pending",
    "return_to_sender": false
  }
}

推荐阅读