2017-06-10 2 views
0

Je suis en train d'installer un webhook sur Asana ce qui suit:Comment installer un webhook sur l'API Asana

token = <user_token> 
uri = URI.parse("https://app.asana.com/api/1.0/webhooks") 
request = Net::HTTP::Post.new(uri) 
request["Authorization"] = "Bearer #{token}" 
request.set_form_data(
    "resource" => "219668070168571", 
    "target" => "https://myserveraddress/api/webhooks/asana/1234", 
) 

req_options = { 
    use_ssl: uri.scheme == "https", 
} 

response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http| 
    http.request(request) 
end 

puts response.body 
puts response.code 

Et ceci est mon contrôleur de manipulation de la réponse:

response.set_header("X-Hook-Secret", request.headers["X-Hook-Secret"]) 
head 200 

Et quand Je fais une demande boucle comme:

curl -i --header "X-Hook-Secret: 12356789" https://myserveraddress/api/webhooks/asana/1234 

Je reçois la réponse suivante:

HTTP/1.1 200 OK 
X-Hook-Secret: 12356789 
Content-Type: text/html 
Cache-Control: no-cache 
X-Request-Id: fd8ec280-9ef1-426c-9cb5-58309f835ccf 
X-Runtime: 0.045875 
Vary: Origin 
Transfer-Encoding: chunked 

Mais lorsque je tente de configurer le webhook je reçois cette réponse de Asana:

{"errors":[{"message":"Could not complete activation handshake with target URL. Please ensure that the receiving server is accepting connections and supports SSL","help":"For more information on API status codes and how to handle them, read the docs on errors: https://asana.com/developers/documentation/getting-started/errors"}]} 

Qu'est-ce que je manque ici?

Répondre

1

Salut @WagnerMatosUK,

Votre réponse me semble bon, de sorte que c'est probablement pas le problème. Je soupçonne ce qui se passe, mais ...

L'ordre de la poignée de main de webhook va comme ceci:

client     server 
|-- POST /api/1.0/webhooks --->| 
           | 
|<--- POST {yourcallback} ---- | 
|        | 
|--- 200 OK [with secret] ---> | 
           | 
<--------- 200 OK -------------| 

C'est, le rappel se à l'intérieur de la demande initiale avant la demande initiale résultats. Ceci est idéal pour obtenir l'assurance que le webhook est établi, car le retour de la première requête sera soit un succès ou un échec selon ce qui s'est passé avec la négociation. Cependant, cela signifie également que votre serveur doit être en mesure de répondre à la demande de prise de contact entrante avant que la première demande ne renvoie.

Cela a des implications pour les serveurs monothread qui bloquent lors du retour de la première requête - à savoir, ils sont bloqués! Ils ne peuvent pas répondre à la deuxième demande jusqu'à ce que retourne la première demande. La solution consiste à lancer la première requête dans un thread, ce qui libère le second thread à se produire, ou à exécuter plusieurs serveurs en parallèle en quelque sorte (comme le fait Unicorn) de sorte qu'un serveur en processus 2 peut gérer le handshake tandis que le processus 1 est bloqué.

Espérons que cela a du sens et résout le problème! À votre santé!

+0

Bonjour Matt. Merci pour votre réponse et désolé, il m'a pris si longtemps pour commenter. Votre réponse a du sens, cependant mon serveur est déjà threadé (j'utilise Puma), ce qui signifie que la requête d'origine ne bloque pas la seconde. – WagnerMatosUK