2016-11-01 2 views
0

Итак, я использую вызовы API для получения некоторых json-данных, и я использую цикл for для выполнения вызова с использованием нескольких идентификаторов, которые будут возвращать разные данные на основе идентификатора пользователя. Поэтому в основном мы должны обновить разрешения для некоторых из наших пользователей, поэтому данные JSON выглядит как это для пользователей, не имеющих права доступа:Обработка ошибок API

{"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"}} 

так мой вопрос в том, если у меня есть большой ответ со многими результатами как с разрешениями, так и без них, как я могу только вытащить идентификаторы из пользователей с разрешениями и исключить те, у которых нет разрешений.

Say ответ хранится в переменных «данных» и идентификаторы, что я ищу, будет храниться в «RequestID» это код, который я попробовал:

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

из этого кода я получаю TypeError, и он не распознает «результат», потому что первым ответом является пользователь без правильных разрешений.

+0

Лучший способ проверить код статуса HTTP из исходного запроса.Предположим, вы используете библиотеку 'запросов', чтобы выполнить GET для любого ресурса,' status_code' объекта 'request' будет содержать' 401' для отказа в разрешении. Конечно, вы можете использовать любую другую библиотеку. Если все остальное не удается, вы можете использовать тело там и проверить значение 'x ['meta'] ['httpStatus']. – sal

ответ

1

Если у вас есть контроль над JSON:

Одним из возможных решений было бы consturct ваш 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 
+0

Прошу прощения, но как я могу это сделать? Я новичок в python. –

+0

Возможно, я неправильно понял ваш вопрос. У вас есть контроль над json, который вы получаете, или нет? – nmg49

+0

Я не просто использую идентификатор пользователя в качестве параметра, чтобы получить json с вызовом api –

2

Лучший способ проверить код статуса 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'] 

, которые в основном только принимать элементы, где «мета» «httpStatus» является искомым..

Для requests библиотеки, посмотрите здесь: http://docs.python-requests.org/

+0

Спасибо, я закончил использовать путь Сала, но ваш помог мне понять концепцию. –