【问题标题】:How do I get my JSON decoder to work properly?如何让我的 JSON 解码器正常工作?
【发布时间】:2020-08-02 18:48:02
【问题描述】:

我正在进行 API 测试,我尝试了所有方法,但它不会将 JSON 文件打印成字符串。我想知道是不是我正在测试 API 请求的网站,因为我不断收到 406 错误。我什至尝试从网上获取显示如何执行此操作的代码,但它仍然无法打印,并且会给出下面列出的错误。这里我给出我使用的代码和 Pycharm 的控制台给我的响应。

import json
import requests

res = requests.get("http://dummy.restapiexample.com/api/v1/employees")
data = json.loads(res.text)
data = json.dumps(data)
print(data)
print(type(data))

Traceback (most recent call last):
  File "C:/Users/johnc/PycharmProjects/API_testing/api_testing.py", line 8, in <module>
    data = json.loads(res.text)
  File "D:\Program Files (x86)\lib\json\__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "D:\Program Files (x86)\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "D:\Program Files (x86)\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)






                     

【问题讨论】:

    标签: python json api testing websocket


    【解决方案1】:

    REST API 接受的请求类型差异很大。 406 表示您没有为服务器提供足够的信息来格式化响应。您应该包含一个用户代理,因为 API 经常被调整以处理各种 http 客户端的弱点,并专门列出您想要的输出格式。添加可接受的编码可以让 API 压缩数据。字符集是个好主意。您甚至可以添加语言请求,但大多数 API 并不关心。

    import json
    import requests
    
    headers={"Accept":"application/json",
        "User-agent": "Mozilla/5.0",
        "Accept-Charset":"utf-8", 
        "Accept-Encoding":"gzip, deflate", 
        "Accept-Language":"en-US"} # or your favorite language
    res = requests.get("http://dummy.restapiexample.com/api/v1/employees", headers=headers)
    data = json.loads(res.text)
    data = json.dumps(data)
    print(data)
    print(type(data))
    

    关于 REST API 的事情是它们可能会忽略部分或部分标头并返回他们喜欢的内容。无论如何,正确地形成请求是个好主意。

    【讨论】:

    • 感谢这对我帮助很大,我对导致此问题的 API 缺乏了解。我得再研究一下,非常感谢!
    【解决方案2】:

    默认的 Python 用户代理可能已被托管公司阻止。

    您可以设置任何字符串或搜索真实设备字符串。

    res = requests.get("http://dummy.restapiexample.com/api/v1/employees", headers={"User-Agent": "XY"})
    

    【讨论】:

    • 谢谢,这为我提供了可以帮助我检索数据的格式。
    【解决方案3】:

    是您、您的连接或代理。对我来说一切都很好。

    >>> import requests
    >>> res = requests.get("http://dummy.restapiexample.com/api/v1/employees")
    >>> res.raise_for_status()  # would raise if status != 200
    >>> print(res.json())  # `res.json()` is the canonical way to extract JSON from Requests
    {'status': 'success', 'data': [{'id': '1', 'employee_name': 'Tiger Nixon', 'employee_salary': '320800', ...
    

    【讨论】:

    • 不确定,那不是我。不过,我很困惑为什么它对你有用。 REST api 在他们接受的范围内遍布地图,但除非请求本身添加标头,否则您的请求不应该与我的相同吗?令人费解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    相关资源
    最近更新 更多