Передача куки с HTTParty

Это не имеет ничего общего с кортежами. Во всяком случае, невозможно преобразовать из массива в кортеж в общем случае, поскольку массивы могут иметь любую длину, а arty кортежа необходимо знать во время компиляции.

Однако, вы можете решить свою проблему, предоставив перегрузки:

// This function does the actual work
func sumOf(_ numbers: [Int]) -> Int {
    return numbers.reduce(0, +) // functional style with reduce
}

// This overload allows the variadic notation and
// forwards its args to the function above
func sumOf(_ numbers: Int...) -> Int {
    return sumOf(numbers)
}

sumOf(2, 5, 1)

func averageOf(_ numbers: Int...) -> Int {
    // This calls the first function directly
    return sumOf(numbers) / numbers.count
}

averageOf(2, 5, 1)

Возможно, есть лучший способ (например, Scala использует специальный тип, чтобы избежать необходимости перегрузки, вы можете писать в Scala sumOf(numbers: _*) изнутри averageOf без определения двух функций), но я не нашел его в документах.

0
задан Dende 4 March 2019 в 08:22
поделиться

1 ответ

Чтобы войти через HTTParty, вам нужно искать больше вещей, чем куки. Вы также должны увидеть CSRF_token. Я думаю, что вы можете получить authenticity_token с помощью метода gsub, но я попытался, и было довольно сложно создать регулярное выражение. Поэтому я использовал Нокогири для получения токена, который на самом деле присутствует в знаке в форме. Ниже приведены подробности, и в конце я приведу весь код.

Добавляя необходимые Gems, вы можете добавить их в Gemfile

gem 'httparty'
gem 'nokogiri'

Запустить bundle install, чтобы установить Gem.

Чтобы получить CSRF_token, мы должны получить страницу sign_in.

url = "http://localhost:3000/users/sign_in"
get_response = HTTParty.get(url)
noko_doc = Nokogiri::HTML(get_response)
auth_token = noko_doc.css('form').css('input[name="authenticity_token"]').first.values[2]

Таким образом, мы получили auth_token, который был в форме как скрытое поле. Теперь давайте получим куки, так как сеансовые куки могут понадобиться.

cookie_hash = HTTParty::CookieHash.new
get_response.get_fields('Set-Cookie').each { |c| cookie_hash.add_cookies(c) }

Здесь мы получаем куки, где также присутствует сессия. Теперь пришло время получить окончательные параметры, и мы отправим файлы cookie и сеанс для входа в систему

params = {"utf8" => "✓", "authenticity_token" => auth_token, "user[email]"=>"user@email.com",·
          "user[password]"=>"password"}

params["commit"] = "Login"

Теперь параметры готовы, вы можете использовать следующий запрос httparty для входа и получения файлов cookie.

response = HTTParty.post("http://localhost:3000/users/sign_in", {:body=>params, headers: {'Cookie' => cookie_hash.to_cookie_string }} )

Теперь для другого запроса вы можете запустить тот же метод куки-файлов, чтобы вернуть все куки-файлы

cookie_hash = HTTParty::CookieHash.new
get_response.get_fields('Set-Cookie').each { |c| cookie_hash.add_cookies(c) }

И для доступа к другим страницам вы можете отправить запрос с куки-файлами, как мы это делали в предыдущем примере. Помните, что если вы снова собираетесь использовать какую-либо страницу, имеющую форму, вам снова нужно получить ее csrf.

response = HTTParty.post("http://localhost:3000/users/other_urls", {headers: {'Cookie' => cookie_hash.to_cookie_string }} )

Я попробовал этот код, и он работает отлично. Вот полный код для вашего использования

require 'httparty'
require 'Nokogiri'
require 'Pry'

url = "http://localhost:3000/users/sign_in"

get_response = HTTParty.get(url)
noko_doc = Nokogiri::HTML(get_response)
auth_token = noko_doc.css('form').css('input[name="authenticity_token"]').first.values[2]
cookie_hash = HTTParty::CookieHash.new
get_response.get_fields('Set-Cookie').each { |c| cookie_hash.add_cookies(c) }

params = {"utf8" => "✓", "authenticity_token" => auth_token, "user[email]"=>"user@example.com",·
          "user[password]"=>"password"}

params["commit"] = "Login"

response = HTTParty.post("http://localhost:3000/users/sign_in", {:body=>params, headers: {'Cookie' => cookie_hash.to_cookie_string }} )

puts response
0
ответ дан KamalPanhwar 4 March 2019 в 08:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: