Как перевести пример запроса PHP SoapClient на RoR? - PullRequest
0 голосов
/ 15 мая 2018

Я бы хотел использовать какой-либо веб-сервис через его API.В документации я нашел пример запроса, написанного с помощью PHP SoapClient.Но я использую RoR, и у меня нет опыта PHP.Может кто-нибудь сказать мне, как мне написать то же самое в RoR, или хотя бы перевести его на простую терминологию HTTP?

<?php
  $soap = new SoapClient(“https://secure.przelewy24.pl/external/wsdl/service.php?wsdl”);
  $test = $soap->TestAccess(“9999”, “anuniquekeyretrievedfromprzelewy24”);
  if ($test)
    echo ‘Access granted’;
  else
    echo ‘Access denied’;
?> 

Редактировать: особенно я хотел бы знать, что мне делать с методом TestAccessпотому что нет никаких методов в простом HTTP.Должен ли я присоединиться к этому имени с помощью URL?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Чтобы упростить свою жизнь, посмотрите на драгоценный камень, который позволяет упростить доступ к SOAP, например savon .

Тогда код можно перевести как

# create a client for the service
client = Savon.client(wsdl: 'https://secure.przelewy24.pl/external/wsdl/service.php?wsdl')

Это автоматически проанализирует возможные методы client, которые предлагаются в SOAP API (определенном в WSDL). Чтобы просмотреть список возможных операций, введите

client.operations

В вашем случае это будет список

[:test_access, :trn_refund, :trn_by_session_id, :trn_full_by_session_id, :trn_list_by_date, :trn_list_by_batch, :trn_full_by_batch, :payment_methods, :currency_exchange, :refund_by_id, :trn_register, :trn_internal_register, :check_nip, :company_register, :company_update, :batch_list, :trn_dispatch, :charge_back, :trn_check_funds, :check_merchant_funds, :transfer_merchant_funds, :verify_transaction, :register_transaction, :deny_transaction, :batch_details]

Затем, чтобы вызвать метод, выполните следующее

response = client.call(:test_access, message: { test_access_in: 9999 })
response = client.call(:test_access, message: { 
   test_access_in: 9999 }
   test_access_out: "anuniquekeyretrievedfromprzelewy24" 
)
response.body
 => {:test_access_response=>{:return=>false}}

это дает результат, но я понятия не имею, что это значит.

0 голосов
/ 15 мая 2018

Я включил весь метод контроллера, который мы используем в производстве в качестве примера, но по сути вы хотите передать ваш запрос xml / wsdl в качестве тела HTTP-запроса, а затем проанализировать ответ как xml или то, что мы использовали ниже которого rexml для более удобного просмотра возвращенного документа.

def get_chrome_styles
  require 'net/http'
  require 'net/https'
  require 'rexml/document'
  require 'rexml/formatters/pretty'

  xml = '<?xml version="1.0" encoding="UTF-8"?>
      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:description7b.services.chrome.com">
        <soapenv:Header/>
        <soapenv:Body>
           <urn:StylesRequest modelId="' + params[:model_id] + '">
              <urn:accountInfo number="[redacted]" secret="[redacted]" country="US" language="en" behalfOf="trace"/>
              <!--Optional:-->
           </urn:StylesRequest>
        </soapenv:Body>
      </soapenv:Envelope>'


  base_url = 'http://services.chromedata.com/Description/7b?wsdl'
  uri = URI.parse( base_url )
  http = Net::HTTP.new(uri.host, uri.port)

  request = Net::HTTP::Post.new("/Description/7b?wsdl")
  request.add_field('Content-Type', 'text/xml; charset=utf-8')
  request.body = xml
  response = http.request( request )

  doc  = REXML::Document.new(response.body)

  options = []
  doc.get_elements('//style').each do |division|
    puts division
    options << { :id => division.attributes['id'], :val => division.text }
  end

  respond_to do |format|
    format.json { render :json => options.to_json }
  end
end
...