Что делать, когда api возвращает html или json для разных ошибок

#python #json #http #python-requests

#python #json #http #python-запросы

Вопрос:

Использование python запрашивает доступ к API github.

 response = requests.post('https://api.github.com/orgs/orgname/repos', auth, data)
  

Если запрос возвращает ошибку 405, я получаю HTML в response.text

 <html>
<head><title>405 Not Allowed</title></head>
<body bgcolor="white">
<center><h1>405 Not Allowed</h1></center>
</body>
</html>
  

Если запрос возвращает ошибку 422, я получаю JSON в response.text

 {"message":"Validation Failed","errors":        [{"resource":"Repository","code":"custom","field":"name","message":"name already exists on this account"}],"documentation_url":"https://developer.github.com/v3/repos/#create"}
  

Могу ли я заставить API возвращать только JSON?

Если нет, могу ли я узнать, какого типа будет содержимое ответа?

Комментарии:

1. Чтобы узнать, в каком ответе будет содержаться содержимое, вы можете проверить http response code !

2. Также, как я читал здесь: developer.github.com/v3/#schema все данные отправляются и принимаются как JSON , так что в вашем случае это может быть проблема с аутентификацией — или, другими словами, вы пытаетесь получить not-allowed содержимое, и, возможно, именно поэтому сервер не отправляет ответ обратно, а вместо этого печатает сообщение not allowed HTML

3. Вы можете try: json.loads() использовать, а затем, кроме html.

Ответ №1:

В ответ на:

Если нет, могу ли я узнать, какого типа будет содержимое ответа?

Если вы хотите знать, почему github возвращает html, а не JSON для вызова API, я не могу ответить на это; однако, чтобы ответить на заданный выше вопрос, вы можете посмотреть заголовок «content» http-ответа.

 response = requests.post('https://api.github.com/orgs/orgname/repos', auth, data)
if "application/json" in response.headers['content-type']:
    print response.json()
  

В ответ на:

Могу ли я заставить API возвращать только JSON? вы можете попробовать принудительно ввести заголовок «Принять» в запросе; однако это зависит от сервера GitHub, если он хочет использовать json в ответе

 response = requests.post('https://api.github.com/orgs/omnifone/repos', auth=auth, data=data, headers={"Accept": "application/json"})