python - 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
解决方案
如果我在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
}
}
推荐阅读
- mysql - SQL 查询在所有列中查找重复次数最多的 2 值
- c++ - 从内存中安全地删除字符串内容
- java - Android Notification Click to Broadcast Receiver 获得相同的意图字符串
- python - 简单的http服务器转换为exe后不起作用
- python - 通过 Ubuntu 终端选项卡自动循环切换器
- elixir - `:zlib.gunzip` 和 `:zlib.inflate/2` 工作正常,但我在尝试使用 `:zlib.safeInflate/2` 制作流时得到 `:data_error`
- php - 我在 Stripe 集成中发现了致命错误
- javascript - javascript style.textDecoration 包含意外的 rgb 值?
- mysql - MySQL使用循环更新列中的数据
- java - 在 Java 中生成常量数组的最简单方法