Чтобы войти через 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
Единственный обходной путь, который мне удалось найти, - это отредактировать сгенерированный код вручную и удалить все из перегрузок, которые мне не нужны.
Write a script that'll do this text fix and set it as the post-build script for your proxy library.
Я не видел этого вопроса раньше, потому что у вас есть тег «java», а я игнорирую вопросы Java. Ваш вопрос не был о Java, поэтому в нем не должно быть тега «java».
svcutil не переименовывает перегруженные операции. Это потому, что нет такого понятия, как перегруженные операции. В WSDL нет концепции двух операций с одним и тем же именем, но использующих разные сообщения.
Если вы посмотрите на WSDL от Axis, я думаю, вы обнаружите, что к операциям добавлены номера.
Исправление: В комментарии Марк Гуд правильно указывает, что WSDL 1.1 допускает перегрузку. Я думаю, что это имеет смысл только в контексте службы на основе RPC, где имя сообщения может использоваться для различения одной перегрузки от другой.
Однако он может не знать, что перегрузка оператора запрещена базовым профилем WS-I 1.1 :
4.5.3 Особые операции
Перегрузка имени операции в wsdl: portType
запрещена профилем.
R2304 A wsdl: portType
в ОПИСАНИЕ ДОЛЖНЫ иметь операции с разными значениями атрибутов имени.
Обратите внимание, что это требование применяется только к wsdl: operations
в пределах данного wsdl: portType
. wsdl: portType
может иметь wsdl: operations
с именами, такими же, как и в других wsdl: portTypes
.
Если кто-то читает больше из WS-I BP1.1,