web-dev-qa-db-fra.com

Envoi de JSON à Slack dans un HTTP POST demande

J'essaie d'envoyer un message à l'aide de l'appel de chat.postMessage API de Slack. Je n'ai aucun problème à coder mes messages de test dans HTTP GET, mais j'essaie d'obtenir le même résultat avec JSON dans une requête HTTP POST.

J'ai déjà testé curl et Postman , mais Slack ne semble pas reconnaître le corps de ma demande.

{
  "ok": false,
  "error": "not_authed"
}

Dans curl, ma demande est codée comme suit:

curl -H "Content-type: application/json" -X POST -d '{"token":"my-token-here","channel":"#channel-name-or-id","text":"Text here.","username":"otherusername"}'

Dans Postman, voici le corps brut:

{
    "token":"my-token-here",
    "channel":"#channel-name-or-id",
    "text":"Text here.",
    "username":"otherusername"
}

Je n'ai jamais rien fait de tel auparavant, alors je ne suis pas sûr d'avoir oublié quelque chose. Merci!

37
Valentine

Je suis un peu en retard, mais j'espère que cela pourra aider d'autres personnes qui tombent dans ce problème comme moi. Je viens d'être en contact avec Slack, et voici ce qu'ils m'ont dit:

L'API Web Slack n'accepte pas les données JSON. Par conséquent, avec la modification du type de contenu, ces variables doivent être publiées à l'aide des attributs de formulaire HTTP standard.

Nous prévoyons de prendre en charge les données JSON à l'avenir pour assurer la cohérence à l'avenir.

Ainsi, votre ligne cURL devrait ressembler à:

curl -X POST -d 'token=my-token-here&channel=#channel-name-or-id&text=Text here.&username=otherusername'`

J'espère que ça aide! :)

61
finferflu

D'accord, après avoir relu la documentation, je l'ai trouvée:

Corps encodés en JSON

Pour ces méthodes d'écriture, vous pouvez également envoyer votre HTTP POST données en tant que type de contenu: application/json.

Il y a quelques règles de base:

  • Vous devez explicitement définir l'en-tête HTTP de type de contenu sur application/json. Nous n'interpréterons pas votre corps POST comme tel sans lui.
  • Vous devez transmettre votre jeton en tant que jeton porteur dans l'en-tête HTTP d'autorisation.
  • Vous ne pouvez pas envoyer votre jeton en tant que partie de la chaîne de requête ou en tant qu'attribut dans votre JSON publié.
  • Ne mélangez pas les arguments entre la chaîne de requête, le corps POST codé en URL et les attributs JSON. Choisissez une approche par demande.
  • Fournir une valeur explicitement nulle pour un attribut entraînera le comportement par défaut qui lui est attribué.

Et l'exemple curl. Notez le Authorization header.

curl -X POST \
     -H 'Authorization: Bearer xoxb-1234-56789abcdefghijklmnop' \
     -H 'Content-type: application/json; charset=utf-8' \
    --data '{"channel":"C061EG9SL","text":""..."}' \
https://slack.com/api/chat.postMessage
8
LSerni

Cela n’est peut-être pas éligible pour la réponse complète, mais si le but est d’envoyer une pièce jointe à un message, vous pouvez envoyer une structure JSON urlencoded en tant que valeur du paramètre attachments, comme suit (divisée en plusieurs lignes pour plus de clarté):

https://slack.com/api/chat.postMessage?
token=YOUR-TOKE-N000&
channel=%23alerts&
text=Hi&
attachments=%5B%7B%22color%22%3A%22good%22%2C%22fallback%22%3A%22plain+text%22%2C%22text%22%3A%22colored+text%22%7D%5D

La valeur de attachments est [{"color":"good","fallback":"plain text","text":"colored text"}] codé en URL. Vous devriez pouvoir utiliser tous les attributs de pièce jointe décrits ici .

6
mustaccio

À partir de mars 2018 , Slack prend maintenant en chargePOSTavecJSONbody

Point de terminaison : https://slack.com/api/chat.postMessage

En-têtes : Authorization: Bearer xoxp-your-hardly-find-token-here

Corps : {"channel":"CH9NN37","text":"something from me!"}

Notez le Bearer dans l'en-tête Authorization .

4
vnpnlz

Slack a été mis à jour, cela fonctionne maintenant. Essayez cet exemple:

curl -X POST -H 'Content-type: application/json' --data '{"text":"This is a line of text.\nAnd this is another one."}' https://hooks.slack.com/services/AAAAAA/BBBBBB/CCCCCC

Voir https://api.slack.com/incoming-webhooks pour obtenir de la documentation.

3
William Entriken

Essayez de mettre chaque propriété dans son propre paramètre -d, comme ceci:

curl https://slack.com/api/chat.postMessage -X POST -d "channel=#tehchannel" -d "text=teh text" -d "username=teh user" -d "token=teh-token-you-got-from-teh-page-that-machinehead115-linked-to" -d "icon_emoji=:simple_smile:"
3
Linus Proxy

not_authed signifie aucun jeton d'authentification fourni.

Quel jeton passez-vous dans la demande? Vous devez passer votre jeton OAuth, que vous pouvez obtenir de ici .

1
machinehead115

Sur postman, vous pouvez définir votre demande comme suit:

url (POST): https://slack.com/api/chat.postMessage

Ensuite, dans la section Headers, mettez ces deux en-têtes:

  1. clé (Content-Type) valeur (application/json)

  2. clé (Authorization) valeur (YOUR-TOKEN-NAME)

Ensuite, dans la section Body de la forme raw, mettez vos données:

    {"channel": "CHANNEL-NAME", "data": "You better post this to channel"}
1
Umesh Poswal

Je l'ai fait dans PowerShell et cela fonctionne comme un charme.

$url="https://slack.com/api/chat.postMessage"
    $messageContent= # your message here
    $token = # your token here
    $channel = # channel name
    $opt_username= # optional user name

    $body = @{token=$token;channel=$channel;username=$opt_username;text=$messageContent;pretty=1}

    try
    {
        Invoke-WebRequest -Uri $url -Method POST -Body $body
    }
    catch
    {
        Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__ 
        Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription        
    }
0
Tapan Banerjee