복붙노트

[RUBY-ON-RAILS] 루비와 SOAP를 사용하는 가장 좋은 방법은 무엇입니까?

RUBY-ON-RAILS

루비와 SOAP를 사용하는 가장 좋은 방법은 무엇입니까?

내 클라이언트는 레일 응용 프로그램에 제 3 자 API를 통합달라고 부탁했다. 유일한 문제는 API는 SOAP를 사용한다는 것입니다. 루비는 기본적으로 REST의 찬성 SOAP 떨어졌다. 그들은 분명히 자바 루비 다리와 함께 작동하는 Java 어댑터를 제공하지만, 우리는 가능하면 루비에서 모든 것을 유지하고 싶습니다. 나는 soap4r에 보였다, 그러나 약간 나쁜 평판을 갖고있는 것 같아요.

그래서 레일 응용 프로그램에 SOAP 호출을 통합 할 수있는 가장 좋은 방법은 무엇입니까?

해결법

  1. ==============================

    1.우리는 실제로 SOAP4R입니다 비누 / wsdlDriver 클래스, 내장 사용. 그것은 느린 개,하지만 정말 간단합니다. 당신이 등 / 보석에서 얻을 수 있다는 SOAP4R 같은 일의 단지 업데이트 된 버전입니다.

    우리는 실제로 SOAP4R입니다 비누 / wsdlDriver 클래스, 내장 사용. 그것은 느린 개,하지만 정말 간단합니다. 당신이 등 / 보석에서 얻을 수 있다는 SOAP4R 같은 일의 단지 업데이트 된 버전입니다.

    예제 코드 :

    require 'soap/wsdlDriver'
    
    client = SOAP::WSDLDriverFactory.new( 'http://example.com/service.wsdl' ).create_rpc_driver
    result = client.doStuff();
    

    즉, 그것에 대해의

  2. ==============================

    2.나는 가능한 한 쉽게 루비를 통해 SOAP 웹 서비스와 상호 작용하기 위해 Savon을 만들었습니다. 나는 당신이 그것을 확인하는 것이 좋습니다 것입니다.

    나는 가능한 한 쉽게 루비를 통해 SOAP 웹 서비스와 상호 작용하기 위해 Savon을 만들었습니다. 나는 당신이 그것을 확인하는 것이 좋습니다 것입니다.

  3. ==============================

    3.우리는 Savon에 손을 비누로 전환.

    우리는 Savon에 손을 비누로 전환.

    여기에 두 개의 클라이언트 라이브러리를 비교 블로그 게시물의 시리즈입니다.

  4. ==============================

    4.또한 Savon를 권장합니다. 나는 결과없이, Soap4R 처리하려고 너무 많은 시간을 보냈다. 빅, 기능의 어떤 문서를 부족하지 않습니다.

    또한 Savon를 권장합니다. 나는 결과없이, Soap4R 처리하려고 너무 많은 시간을 보냈다. 빅, 기능의 어떤 문서를 부족하지 않습니다.

    Savon 나에 대한 답변입니다.

  5. ==============================

    5.SOAP4R 시도

    SOAP4R 시도

    그리고 난 그냥 레일 부러워 팟 캐스트 (EP 31)에이에 대해 들어 :

  6. ==============================

    6.그냥 Savon를 사용하여 3 시간 이내 내 물건의 작업을 얻었다.

    그냥 Savon를 사용하여 3 시간 이내 내 물건의 작업을 얻었다.

    Savon의 홈페이지에 시작 설명서를 따라 정말 쉬웠다 - 내가보고 있었는지 사실 (항상 경우) 일치

  7. ==============================

    7.Datanoise에서 켄트 Sibilev은 레일 2.1 (이상)에 레일 ActionWebService 라이브러리를 이식했다. 이것은 당신이 당신의 자신의 루비 기반의 SOAP 서비스를 노출 할 수 있습니다. 그는 심지어 당신이 브라우저를 사용하여 서비스를 테스트 할 수있는 발판 / 테스트 모드가 있습니다.

    Datanoise에서 켄트 Sibilev은 레일 2.1 (이상)에 레일 ActionWebService 라이브러리를 이식했다. 이것은 당신이 당신의 자신의 루비 기반의 SOAP 서비스를 노출 할 수 있습니다. 그는 심지어 당신이 브라우저를 사용하여 서비스를 테스트 할 수있는 발판 / 테스트 모드가 있습니다.

  8. ==============================

    8.나는 내 수용 테스트를 위해 가짜의 SOAP 서버를했습니다 한 루비에서 사용되는 SOAP 있습니다. 나는이 문제를 접근하는 가장 좋은 방법이라면 모르겠지만, 나를 위해 일했다.

    나는 내 수용 테스트를 위해 가짜의 SOAP 서버를했습니다 한 루비에서 사용되는 SOAP 있습니다. 나는이 문제를 접근하는 가장 좋은 방법이라면 모르겠지만, 나를 위해 일했다.

    내가시나 보석을 사용했다 (SOAP는 XML과 협력) XML의 물건도 노코 기리를 서버와 (내가 여기시나와 조롱 끝점을 만드는 방법에 대해 썼다).

    그래서 시작을 위해 내가 SOAP 서버가 반환하는 미리 정의 된 답변을 넣어 가지고있는 두 개의 파일 (예를 들어, config.rb 및 responses.rb)를 만들 수 있습니다. config.rb에서 나는 WSDL 파일을 추가하는 듯했으나 문자열로했다.

    @@wsdl = '<wsdl:definitions name="StockQuote"
             targetNamespace="http://example.com/stockquote.wsdl"
             xmlns:tns="http://example.com/stockquote.wsdl"
             xmlns:xsd1="http://example.com/stockquote.xsd"
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
             xmlns="http://schemas.xmlsoap.org/wsdl/">
             .......
          </wsdl:definitions>'
    

    responses.rb에서 나는 SOAP 서버가 서로 다른 시나리오에 돌려 보낼 응답을 넣어 샘플을 가지고있다.

    @@login_failure = "<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
        <s:Body>
            <LoginResponse xmlns="http://tempuri.org/">
                <LoginResult xmlns:a="http://schemas.datacontract.org/2004/07/WEBMethodsObjects" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                    <a:Error>Invalid username and password</a:Error>
                    <a:ObjectInformation i:nil="true"/>
                    <a:Response>false</a:Response>
                </LoginResult>
            </LoginResponse>
        </s:Body>
    </s:Envelope>"
    

    그래서 지금은 실제로 서버를 만들었습니다 어떻게 내가 당신을 보여 드리죠.

    require 'sinatra'
    require 'json'
    require 'nokogiri'
    require_relative 'config/config.rb'
    require_relative 'config/responses.rb'
    
    after do
    # cors
    headers({
        "Access-Control-Allow-Origin" => "*",
        "Access-Control-Allow-Methods" => "POST",
        "Access-Control-Allow-Headers" => "content-type",
    })
    
    # json
    content_type :json
    end
    
    #when accessing the /HaWebMethods route the server will return either the WSDL file, either and XSD (I don't know exactly how to explain this but it is a WSDL dependency)
    get "/HAWebMethods/" do
      case request.query_string
        when 'xsd=xsd0'
            status 200
            body = @@xsd0
        when 'wsdl'
            status 200
            body = @@wsdl
      end
    end
    
    post '/HAWebMethods/soap' do
    request_payload = request.body.read
    request_payload = Nokogiri::XML request_payload
    request_payload.remove_namespaces!
    
    if request_payload.css('Body').text != ''
        if request_payload.css('Login').text != ''
            if request_payload.css('email').text == some username && request_payload.css('password').text == some password
                status 200
                body = @@login_success
            else
                status 200
                body = @@login_failure
            end
        end
    end
    end
    

    이 정보가 도움 바랍니다!

  9. ==============================

    9.저도 같은 문제가 발생하고, Savon로 전환 한 후 바로 오픈 WSDL에 그것을 테스트 (나는 http://www.webservicex.net/geoipservice.asmx?WSDL을 사용) 지금까지 좋은 있도록!

    저도 같은 문제가 발생하고, Savon로 전환 한 후 바로 오픈 WSDL에 그것을 테스트 (나는 http://www.webservicex.net/geoipservice.asmx?WSDL을 사용) 지금까지 좋은 있도록!

    https://github.com/savonrb/savon

  10. ==============================

    10.I는 SOAP 메소드를 호출하려면 다음과 같은 HTTP 호출을 사용했다

    I는 SOAP 메소드를 호출하려면 다음과 같은 HTTP 호출을 사용했다

    require 'net/http'
    
    class MyHelper
      def initialize(server, port, username, password)
        @server = server
        @port = port
        @username = username
        @password = password
    
        puts "Initialised My Helper using #{@server}:#{@port} username=#{@username}"
      end
    
    
    
      def post_job(job_name)
    
        puts "Posting job #{job_name} to update order service"
    
        job_xml ="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns=\"http://test.com/Test/CreateUpdateOrders/1.0\">
        <soapenv:Header/>
        <soapenv:Body>
           <ns:CreateTestUpdateOrdersReq>
              <ContractGroup>ITE2</ContractGroup>
              <ProductID>topo</ProductID>
              <PublicationReference>#{job_name}</PublicationReference>
           </ns:CreateTestUpdateOrdersReq>
        </soapenv:Body>
     </soapenv:Envelope>"
    
        @http = Net::HTTP.new(@server, @port)
        puts "server: " + @server  + "port  : " + @port
        request = Net::HTTP::Post.new(('/XISOAPAdapter/MessageServlet?/Test/CreateUpdateOrders/1.0'), initheader = {'Content-Type' => 'text/xml'})
        request.basic_auth(@username, @password)
        request.body = job_xml
        response = @http.request(request)
    
        puts "request was made to server " + @server
    
        validate_response(response, "post_job_to_pega_updateorder job", '200')
    
      end
    
    
    
      private 
    
      def validate_response(response, operation, required_code)
        if response.code != required_code
          raise "#{operation} operation failed. Response was [#{response.inspect} #{response.to_hash.inspect} #{response.body}]"
        end
      end
    end
    
    /*
    test = MyHelper.new("mysvr.test.test.com","8102","myusername","mypassword")
    test.post_job("test_201601281419")
    */
    

    희망이 도움이. 건배.

  11. from https://stackoverflow.com/questions/40273/whats-the-best-way-to-use-soap-with-ruby by cc-by-sa and MIT license