WCF: Svcutil генерирует недопустимый клиентский прокси, веб-сервис ОСИ Apache, операции перегрузки

Чтобы войти через 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
5
задан John Saunders 31 July 2009 в 15:26
поделиться

3 ответа

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

3
ответ дан 14 December 2019 в 01:16
поделиться

Write a script that'll do this text fix and set it as the post-build script for your proxy library.

0
ответ дан 14 December 2019 в 01:16
поделиться

Я не видел этого вопроса раньше, потому что у вас есть тег «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,

1
ответ дан 14 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

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