Python HTTP请求返回404或字节 [英] Python HTTP Request Returns 404 or Bytes

查看:71
本文介绍了Python HTTP请求返回404或字节的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Python脚本来调用以下链接中详细介绍的API:

I'm trying to use a Python script to call the API detailed in the link below:

https://developer.wmata.com/docs/services/gtfs/operations/5cdc51ea7a6be320cab064fe ?

当我使用下面的代码时,它总是返回404错误:

When I use the code below, it always returns a 404 error:

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())

我也尝试使用链接中提供的python代码,但是它返回的响应内容无意义,如下所示.任何尝试解码内容的尝试均未成功.

I have also tried using the python code provided in the link, but it returns meaningless response content as shown below. 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!

推荐答案

更改为 pull_data 函数如下:

def pull_data():
    return requests.get(_url("/gtfs/bus-gtfsrt-tripupdates.pb"), headers=headers)

然后将 params 模块全局变量重命名为 headers .

Then rename params module global variable to headers .

headers = {"apiKey": "mykey"}

WMATA在标题而不是查询参数中查找 apiKey .

WMATA looks for a apiKey in the headers, not in the query params.

更新:我注意到他们对某些示例使用了 api_key ,而对另一些示例使用了 apiKey .例如,请参见: https://developer.wmata.com/docs/services/gtfs/operations/5cdc51ea7a6be320cab064fe

Update: I noticed they use api_key for some samples, and apiKey for another ones. For example see: https://developer.wmata.com/docs/services/gtfs/operations/5cdc51ea7a6be320cab064fe

更新2:请注意响应标题中的内容类型:

Update 2: Notice the content type in the response headers :

print(response.headers['content-type'])
# application/octet-stream

它不是JSON.您可以获得的内容如下:

it is not a JSON. You can get contents as follows:

print(response.content)

工作示例:

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)

这篇关于Python HTTP请求返回404或字节的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆