[英]Python HTTP Request Returns 404 or Bytes
I'm trying to use a Python script to call the API detailed in the link below:我正在尝试使用 Python 脚本来调用下面链接中详述的 API:
https://developer.wmata.com/docs/services/gtfs/operations/5cdc51ea7a6be320cab064fe ? https://developer.wmata.com/docs/services/gtfs/operations/5cdc51ea7a6be320cab064fe ?
When I use the code below, it always returns a 404 error:当我使用下面的代码时,它总是返回 404 错误:
import requests
import json
def _url(path):
return "http://api.wmata.com" + path
def pull_data():
return requests.get(_url("/gtfs/bus-gtfsrt-tripupdates.pb"), params=params)
def jprint(obj):
# create a formatted string of the Python JSON object
text = json.dumps(obj, sort_keys=True, indent=4)
print(text)
# authenticate with your api key
params = {
"apiKey": "mykey",
}
response = pull_data()
print(response)
jprint(response.json())
I have also tried using the python code provided in the link, but it returns meaningless response content as shown below.我也尝试过使用链接中提供的 python 代码,但它返回无意义的响应内容,如下所示。 Any attempts to decode the content have been unsuccessful.
对内容进行解码的任何尝试均未成功。
Request-Context: appId=cid-v1:2833aead-1a1f-4ffd-874e-ef3a5ceb1de8
Cache-Control: public, must-revalidate, max-age=5
Date: Thu, 11 Feb 2021 22:05:31 GMT
ETag: 0x8D8CED90CC8419C
Content-Length: 625753
Content-MD5: fspEFl7LJ8QbZPgf677WqQ==
Content-Type: application/octet-stream
Expires: Thu, 11 Feb 2021 22:05:37 GMT
Last-Modified: Thu, 11 Feb 2021 22:04:49 GMT
1.0�Ԗ��
1818410080�
181841008020210211*52!�Ԗ�"19032("�Ԗ�"18173(#�Ԗ�"7779($�Ֆ�"18174(%�Ֆ�"7909(&�Ֆ�"7986('�Ֆ�"8039((�Ֆ�"8130()�֖�"8276(+�֖�"8313(,�ז�"8403(-�ז�"8452(.�ז�"8520(/�ؖ�"8604(1�ؖ�"8676(
7070 �Ӗ�(����������
1814174080�
181417408020210211*P129�Ԗ�"2373(:�Ԗ�"2387(;�Ԗ�"17296(=�Ֆ�"17212(>�֖�"2444(?�֖�"2493(@�֖�"2607(A�֖�"14633(B�֖�"2784(C�ז�"2832(D�ז�"2843(E�ז�"2848(F�ז�"2875(G�ؖ�"2945(H�ؖ�"2987(I�ؖ�"21946(K�ٖ�"14636(L�ٖ�"3122(M�ٖ�"3227(N�ٖ�"3308(O�ٖ�"3411(P�ٖ�"3500(Q�ٖ�"3539(R�ٖ�"14637(S�ږ�"3685(T�ږ�"15195(U�ږ�"15196(V�ۖ�"4243(W�ۖ�"4443(X�ۖ�"4517(Y�ۖ�"4631([�ܖ�"11962(
8002 �Ӗ�(/�
1825989080�
182598908020210211*7Y�Ӗ�"2158(�Ԗ�"2215(�Ԗ�"2259(�Ԗ�"2292(�Ԗ�"2299(�Ֆ�"18701(�Ֆ�"2310( �Ֆ�"2245(!�Ֆ�"2174("�Ֆ�"1987(#�֖�"1937(%�֖�"1864(
3191 �Ӗ�(��
1819988080�
Any guidance or direction would be greatly appreciated!任何指导或方向将不胜感激!
Try changing your URL so that it is using https instead of http.尝试更改您的 URL,使其使用 https 而不是 http。 The documentation that you have linked at Bus RT Trip Updates seems to indicate that https is required.
您在 Bus RT Trip Updates 链接的文档似乎表明需要 https。
Change this:改变这个:
def _url(path):
return "http://api.wmata.com" + path
to make it this:做到这一点:
def _url(path):
return "https://api.wmata.com" + path
Change as pull_data
function as follows:更改为
pull_data
function 如下:
def pull_data():
return requests.get(_url("/gtfs/bus-gtfsrt-tripupdates.pb"), headers=headers)
Then rename params
module global variable to headers
.然后将
params
模块全局变量重命名为headers
。
headers = {"apiKey": "mykey"}
WMATA looks for a apiKey
in the headers, not in the query params. WMATA 在标头中查找
apiKey
,而不是在查询参数中。
Update: I noticed they use api_key
for some samples, and apiKey
for another ones.更新:我注意到他们将
api_key
用于某些示例,而apiKey
用于其他示例。 For example see: https://developer.wmata.com/docs/services/gtfs/operations/5cdc51ea7a6be320cab064fe例如参见: https://developer.wmata.com/docs/services/gtfs/operations/5cdc51ea7a6be320cab064fe
Update 2: Notice the content type in the response headers:更新 2:注意响应标头中的内容类型:
print(response.headers['content-type'])
# application/octet-stream
it is not a JSON.它不是 JSON。 You can get contents as follows:
可以获取如下内容:
print(response.content)
Worked example:工作示例:
import requests
API_URL = 'https://api.wmata.com'
def _prepare_url(path):
return f'{API_URL}/{path.lstrip("/")}'
def pull_data(**options):
url = _prepare_url('/gtfs/bus-gtfsrt-tripupdates.pb')
return requests.get(url, **options)
response = pull_data(headers={'api_key': 'secret'})
print(response.content)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.