如何在Asana API上设置webhook

时间:2017-06-10 07:30:33

标签: ruby asana asana-api

我正在尝试使用以下内容在Asana上设置webhook:

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

这是我的控制器处理响应:

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

当我做一个卷曲请求时,例如:

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

我得到以下答案:

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

但是当我尝试设置webhook时,我得到了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"}]}

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

嘿那里@WagnerMatosUK,

你的回答对我来说很好,所以这可能不是问题所在。我怀疑发生了什么,但是......

webhook握手的顺序如下:

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

也就是说,在原始请求返回之前,回调发生在原始请求中。

这非常适合确保建立webhook,因为第一个请求的返回将是成功还是失败,具体取决于握手发生的情况。但是,这也意味着您的服务器需要能够在第一个请求返回之前响应传入的握手请求

这对阻止第一个请求返回的单线程服务器有影响 - 即它们被阻止!他们无法响应第二个请求,直到第一个请求返回。

解决方案是在一个线程中启动第一个请求,释放第二个线程,或以某种方式并行运行多个服务器(如Unicorn那样),以便进程2中的服务器可以在进程1被阻止时处理握手。

希望这有意义并解决问题!干杯!