конвертировать POST-запрос Strava API Curl в HTTParty - PullRequest
0 голосов
/ 22 января 2020

Это запрос Curl, описанный в документации API Strava:

$  curl -X POST https://www.strava.com/api/v3/push_subscriptions \
      -F client_id=5 \
      -F client_secret=7b2946535949ae70f015d696d8ac602830ece412 \
      -F 'callback_url=http://a-valid.com/url' \
      -F 'verify_token=STRAVA'

Я запустил его из командной строки с соответствующими значениями, и он отлично работает.


Я также могу запустить его в Postman, где запрос выглядит следующим образом: Примечание - нет авторизации и заголовков, только данные формы. Заголовки (10), которые вы можете видеть в Почтальоне, являются временными заголовками, автоматически генерируемыми Почтальоном.

subscription request on postman


Но независимо от того, что я пытаюсь использовать HTTParty Я не могу заставить его работать:

response = HTTParty.post("https://strava.com/api/v3/push_subscriptions", {
        body: {
          callback_url: "#{params}/api/v1/strava/event_data",
          client_secret: "#{ENV["STRAVA_CLIENT_SECRET"]}",
          client_id: "#{ENV["STRAVA_CLIENT_ID"]}",
          verify_token: "STRAVA"
        }.to_json,
        headers: {
          "Content-Type" => "multipart/form-data",
          'Accept' => 'application/json'
        }
      })
response = HTTParty.post("https://strava.com/api/v3/push_subscriptions", {
        body: {
          callback_url: "#{params}/api/v1/strava/event_data",
          client_secret: "#{ENV["STRAVA_CLIENT_SECRET"]}",
          client_id: "#{ENV["STRAVA_CLIENT_ID"]}",
          verify_token: "STRAVA"
        }
      })
response = HTTParty.post("https://strava.com/api/v3/push_subscriptions", {
        body: {
          callback_url: "#{params}/api/v1/strava/event_data",
          client_secret: "#{ENV["STRAVA_CLIENT_SECRET"]}",
          client_id: "#{ENV["STRAVA_CLIENT_ID"]}",
          verify_token: "STRAVA"
        },
        headers: {
          "Content-Type" => "multipart/form-data",
        }
      })

Все приведенные выше HTTP-запросы приводят к следующей ошибке: Net::ReadTimeout: Net::ReadTimeout with #<TCPSocket:(closed)>

Следующий запрос выполняет поразить сервер, но не так, как ожидает Страва, поэтому он не даст желаемых результатов

response = HTTParty.post("https://strava.com/api/v3/push_subscriptions", {
        query: {
          callback_url: "#{params}/api/v1/strava/event_data",
          client_secret: "#{ENV["STRAVA_CLIENT_SECRET"]}",
          client_id: "#{ENV["STRAVA_CLIENT_ID"]}",
          verify_token: "STRAVA"
        }
      })

Кто-нибудь может увидеть, где я с этим не так?

Спасибо за помощь!

ОБНОВЛЕНИЕ:

Я смог заставить его работать, используя Ruby - Net::HTTP:

require "uri"
require "net/http"

url = URI("https://www.strava.com/api/v3/push_subscriptions")

https = Net::HTTP.new(url.host, url.port);
https.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Content-Type"] = "multipart/form-data;"
form_data = [['client_id', '3****'],['client_secret', '461a7cd*****'],['callback_url', 'https://**********/api/v1/strava/event_data'],['verify_token', '******']]
request.set_form form_data, 'multipart/form-data'
response = https.request(request)
puts response.read_body

Было бы здорово, если бы он работал в HTTParty, нам нужно жемчужина в любом случае для других частей проекта и будет держать все единообразно.

...