【问题标题】:API error handlingAPI 错误处理
【发布时间】:2016-11-01 20:23:30
【问题描述】:

所以,我使用 API 调用来获取一些 json 数据,并且我使用 for 循环使用多个 id 执行调用,这将根据用户的 id 返回不同的数据。所以基本上我们需要更新一些用户的权限,这样对于没有权限的用户来说,json 数据看起来有点像这样:

{"meta":{"httpStatus":"401 - Unauthorized","error":{"errorMessage":"Insufficient
permissions.","errorCode":"ARH_8.5"},"requestId":null}}

这适用于具有权限的用户:

{"result":{"elements":[{"id":"dslkjafsadl","name":"Test","ownerId"
:"sdfadfsfsda","lastModified":"2016","isActive":true},
{"id":"dsafsad","name":"Test","ownerId":"sdfasdfa","lastModified":"2016","isActive":true}],"nextPage":null},"meta":{"httpStatus":"200 - OK","requestId":"3242343"}}

所以我的问题是,如果我有很多结果,无论是否有权限,我都有很大的回应,我怎么能只从有权限的用户那里提取 id,而排除没有权限的用户。

假设响应存储在变量“data”中,而我正在寻找的 id 将存储在“requestId”中,这是我尝试过的代码:

requestId = request_id = [element['requestId'] for element in data['result']['elements']]

从这段代码中,我收到一个 TypeError,它无法识别“结果”,因为第一个响应是没有正确权限的用户。

【问题讨论】:

  • 最好的方法是检查原始请求中的http状态码。假设您使用requests 库对任何资源执行GET,requests 对象的status_code 将包含401 以表示权限被拒绝。当然,您可以使用任何其他库。如果一切都失败了,您可以使用上面的正文并检查x['meta']['httpStatus'] value

标签: python api get


【解决方案1】:

最好的方法是检查原始请求中的 http 状态码。假设您使用 requests 库对任何资源执行 GET,请求对象的 status_code 将包含 401 以表示权限被拒绝。

仅依靠您已有的代码,您可以将条件语句包含为:

requestId = request_id = [element['requestId'] for element in data['result']['elements'] if element.get('meta').get('httpStatus') == '200 - OK']

这基本上只会采用 'meta'.'httpStatus' 是所需元素的元素。

对于requests 库,请看这里:http://docs.python-requests.org/

【讨论】:

  • 谢谢你,我最终使用了sal的方式,但你的帮助我掌握了这个概念。
【解决方案2】:

如果您可以控制 JSON:

一种可能的解决方案是构建您的 json,以便有一个描述返回结果的权限的父节点。例如:

{"permissions": false,
    {"meta":{"httpStatus":"401 - Unauthorized","error": 
    {"errorMessage":"Insufficient permissions.","errorCode":"ARH_8.5"},
    "requestId":null}
    }
}

{"permissions": true, 
{"result":{"elements":[{"id":"dslkjafsadl","name":"Test","ownerId"
:"sdfadfsfsda","lastModified":"2016","isActive":true},{"
id":"dsafsad","name":"Test","ownerId":"sdfasdfa","la
stModified":"2016","isActive":true}],"nextPage":null},"meta":{"h
ttpStatus":"200 - OK","requestId":"3242343"}}}

使用此设置,只需读取第一个值,然后相应地构建您的 json 解析代码。

如果您无法控制 JSON:

在这种情况下,您必须先弄清楚您收到的是哪个请求,然后才能真正处理它。一种方法是读取顶部键的名称。

在正确响应的情况下,您可以这样做:

parsed_json = json.loads(json_string)
# The key "result" is only in the sucess response, not in the error response
if "result" in parsed_json: 
  # Success
else:
  # Error 

【讨论】:

  • 很抱歉问这个问题,但是我该怎么做呢?我是 python 新手。
  • 也许我误解了你的问题。您是否可以控制收到的 json?
  • 我不是我只是使用用户ID作为参数通过api调用获取json
  • 啊,好吧。查看我的更新。萨尔的回应也是个好主意。
猜你喜欢
  • 1970-01-01
  • 2018-07-02
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多