Question

I have the following code:

require 'Typhoeus'

  url = Typhoeus::Request.new("https://fluidsurveys.com/api/v2/webhooks/subscribe/",
        userpwd: "username_test:password_test",
        method: :post,
        body: {
             'subscription_url' => 'http://glacial-spire-test.herokuapp.com/hooks/response_created_callback',
             'event' => 'response_complete'
        },
        headers: { 'Content-Type' => "application/json"})

    response = url.run.body
    puts response

This returns a response code of 400 and an error:

Content-Type set to application/json but could not decode valid JSON in request body.

Here are the docs for the API call I am making: http://docs.fluidsurveys.com/api/webhooks.html

POST /api/v2/webhooks/subscribe/¶
Returns a status of 409 if a webhook with the subscription url already exists. Returns a       
status of 201 if the webhook was successfully created. Requests must be sent as an 
application/json-encoded dictionary with the required fields subscription_url and event

Sample request (ACCORDING TO DOCS):

{
  "subscription_url": "http://fluidsurveys.com/api/v2/callback/",
  "event": "response_complete",
  "survey": 1,
  "collector": 1
}

What am I doing wrong here? survey and collector are optional params, and I don't see an issue with the json in my body.

Was it helpful?

Solution

I am guessing you might need to convert the request body into JSON using a library like Oj (https://github.com/ohler55/oj). Using the Oj library:

requestBody = {
  'subscription_url' => 'http://glacial-spire-test.herokuapp.com/hook/response_created_callback',
  'event' => 'response_complete'
}

url = Typhoeus::Request.new("https://fluidsurveys.com/api/v2/webhooks/subscribe/",
        userpwd: "username_test:password_test",
        method: :post,
        body: Oj.dump(requestBody, mode: :compat),
        headers: { 'Content-Type' => "application/json"})

response = url.run.body
puts response

The critical line is:

        body: Oj.dump(requestBody, mode: :compat)

If you need to load any JSON content to Ruby, just use Oj.load

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top