简体   繁体   English

Python HTTP 请求返回 404 或字节

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM