Domanda

LocartLabs e Loc-Aid sono servizi di aggregazione della posizione che espongono API di riposo. Attualmente offrono SDK Java, .NET e PHP. L'API non è complessa ma, comunque, come strumento di apprendimento, sarebbe bello avere un tutorial o un esempio di Ruby con cui giocare, estensione, ecc.

È stato utile?

Soluzione

Dopo ulteriori analisi, ho creato la mia applicazione su Loc-AidInfrastruttura. Dato che non c'erano molti esempi di Ruby che ho potuto trovare, sto condividendo uno snippet dalla mia app.

  # Get SAVON soap client locaid location services
  # Parameters:
  #   - none
  # Returns: SOAP client for locaid location services
  def get_location_client
    Savon::Client.new do
      wsdl.document = LOCAID_CONFIG['use_local_wsdl'] ?
        File.expand_path(LOCAID_CONFIG['get_location_wsdl'].to_s, ::Rails.root.to_s) :
        LOCAID_CONFIG['get_location_wsdl'].to_s
      wsdl.endpoint = LOCAID_CONFIG['get_location_endpoint'].to_s
    end
  end


  # Strip the return result from locaid response as a hash
  # Parameters:
  #   - raw_response: Raw response XMLfrom locaid services
  #   - response_name: Response name which wrap the response return result in locaid response XML
  # Returns: Hash corresponding to the key "return" in locaid soap response hash.
  # Sample Raw Response:
  #   {:subscribe_phone_response=>{:return=>{:error=>{:error_code=>"00001", :error_message=>"Invalid or inactive user"}, :transaction_id=>"14028251"},
  #       :"@xmlns:ns2"=>"http://webservice.portico.locaid.net/"}}
  def strip_locaid_return(raw_response, response_name)
    unless raw_response.to_hash.has_key?(response_name)
      raise TropoExceptions::ExternalError
    end
    raw_response[response_name][:return]
  end

  # Get location from locaid by the caller id
  # Parameters:
  #     - @caller_id: Caller id get from scope value
  # Returns: none
  def location_from_locaid
    client = get_location_client
    client.http.read_timeout = LOCAID_CONFIG['get_location_timeout'].to_i
    # Call locaider service to get location
    response = client.request :wsdl, :get_locations_x do |soap|
      soap.body = {
          :login  => LOCAID_CONFIG['login'],
          :password  => LOCAID_CONFIG['password'],
          :class_id => LOCAID_CONFIG['class_id'],
          :msisdn_list => ["1#{@caller_id}"],
          :coor_type => "DECIMAL",
          :location_method => LOCAID_CONFIG['location_method'],
          :sync_type => "SYN",
          :overage => "1"
      }
    end

    result_hash = strip_locaid_return(response, :get_locations_x_response)
    if result_hash.has_key?(:error)
      raise TropoExceptions::ExternalError
    end

    yield result_hash[:location_response].is_a?(Array) ?
        result_hash[:location_response][0] :
        result_hash[:location_response]

  rescue Savon::Error, Timeout::Error => e
    logger.error e
    yield nil
  end
end
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top