Запросы Python возвращают 400

#python #python-requests #slack

#python #python-запросы #провисание

Вопрос:

у меня есть эта команда

 curl -X POST --data-urlencode "payload={"channel": "#test", "username": "kuhkuh", "text": "This is posted to #test", "icon_emoji": ":ghost:"}" https://hooks.slack.com/services/123/123/123
  

я пытаюсь создать его с помощью Python, чтобы я мог использовать его в своем проекте

 import requests
import json

class SlackWrapper:

    def __init__(self):
        pass

    @classmethod
    def post_message_to_slack(self, err):

        url = 'https://hooks.slack.com/services/123/123/123'

        payload = {
            'channel' :  '#test',
            'username' :  'kuhkuh',
            'message' : err,
            'icon_emoji' : ':ghosts:'
        }
        
        try:
            alert = requests.post(url, data=payload, headers={'Content-Type': 'application/json'})
            print(alert.status_code, ' - ', alert.text, ' - ', json.dumps(payload))
        except Exception as e:
            print(e)

SlackWrapper.post_message_to_slack("testing error message requests")
  

проблема в том, что я продолжаю получать эту ошибку

 <Response [400]>
  

где я ошибся?

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

1. Попробуйте print(alert.status, ' - ', print(alert.text))

2. это дает этот invalid_payload 400 — None

3. print(alert.status, ' - , alert.text) — исправлена строка;

4. смотрите текстовую ошибку из slack API, скорее всего, ваша полезная нагрузка не в правильном формате

Ответ №1:

Ошибка 400 означает «Неверный запрос», поэтому ваша полезная нагрузка неверна.

Если ваш payload уже является dict , нет необходимости json.dumps указывать его в json параметре post request . Также requests достаточно умен, чтобы вывести Content-Type , поэтому нет необходимости явно устанавливать этот заголовок.

 @classmethod
    def post_message_to_slack(self, err):

        url = 'https://hooks.slack.com/services/123/123/123'
        
        # changed the payload
        payload = {
            "channel": "#test", 
            "username": "kuhkuh", 
            "text": "This is posted to #test",
            "icon_emoji": ":ghost:"
        }
        
        try:
            # changed the parameters for posting
            alert = requests.post(url, json=payload) 
            print(alert.status_code, ' - ', alert.text, ' - ', json.dumps(payload))
        except Exception as e:
            print(e)
  

Ответ №2:

Вы можете вставить код curl в postman, затем получить код python и использовать его. Для вашего кода эквивалентный код Python :

 import requests

url = "https://hooks.slack.com/services/123/123/123"

payload = 'payload={"channel": "#test", "username": "kuhkuh", "text": "This is posted to #test", "icon_emoji": ":ghost:"}'
headers = {
  'Content-Type': 'application/x-www-form-urlencoded'
}

response = requests.request("POST", url, headers=headers, data = payload)

print(response.text.encode('utf8'))
  

Ответ №3:

Вы пытаетесь отправить данные на сервер в виде словаря.

Вместо этого попробуйте отправить его в виде данных json, используя атрибут json requests POST

 payload = {
    "channel" =  '#test',
    "username" =  'kuhkuh',
    "message" = err,
    "icon_emoji" = ':ghosts:'
}

alert = requests.post(url, json = payload)


  

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

1. я сделал, я выдает недопустимую полезную нагрузку.

2. печать (alert.status_code, ‘ — ‘, alert.text, ‘ — ‘, json.dumps(полезная нагрузка)) 400 — invalid_payload — {«канал»: «#тест», «имя пользователя»: «kuhkuh», «сообщение»: «запросы на сообщение об ошибке тестирования», «icon_emoji»: «:призраки:»}

3. Если вы использовали data и json.dumps, попробуйте использовать headers={'Content-Type': 'application/json'} в качестве аргумента функции. Если вы использовали json , запросы должны были автоматически отправлять заголовок json. (Помните, что не следует использовать json.dumps для полезной нагрузки, если вы используете json аргумент…

4. @Boidushya Это также было ошибкой в моем ответе, используя json.dumps

5. Также убедитесь, что отправленная вами полезная нагрузка была в правильном формате.