HTTPError:对Python urllib的请求不正确

2024-06-26 01:39:48 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我第一个使用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()

当我使用Python3时,我的代码是

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


Tags: httpsimportcomjsonrequestprivateurlliburlopen
1条回答
网友
1楼 · 发布于 2024-06-26 01:39:48

如果我在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
  }
}

相关问题 更多 >