Consuming a Restful WCF Service with Ruby ActiveResource - wcf

I'm trying to consume a RESTful WCF service in a Rails app using ActiveResource.
My ActiveResource class is:
class PartReferenceService < ActiveResource::Base
self.site = "http://localhost:1234/"
end
The WCF URL is
http://localhost:1234/PartReferenceService.svc/
and it returns XML like:
<ArrayOfReferenceDataModel xmlns="http://schemas.datacontract.org/2004/07/RemoteService.Model" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ReferenceDataModel>
<Description>0460-0054</Description>
<Id>147</Id>
</ReferenceDataModel>
<ReferenceDataModel>
<Description>0960-0095</Description>
<Id>145</Id>
</ReferenceDataModel>
</ArrayOfReferenceDataModel>
I'm getting a 404 when I do:
PartReferenceService.find(:all)
I also can't find the URL that is being requested in my development.log file.
Any suggestions on where I may be going wrong? I'm fairly new to ActiveResource, and WCF for that matter, but my guess is that ActiveResource is creating a url like,
http://localhost:1234/part_reference_service/
but as I can't see anything in the logs I'm flying blind.
I'm in control of both ends so am able to make any changes needed.
Any help is much appreciated.

Use Fiddler to see exactly what is going on in the http requests.

First thing with ActiveResource - alwasy set the ActiveResource::Base.logger. Typically I just do
ActiveResource::Base.logger = ActiveResource::Base.logger
in my environment.rb after the config block.
Second thing with ActiveResource - it's a pretty horrible library, especially to use with a HTTP over XML api other than one produced by Rails (like one from WCF like you have). I've rolled my own solution, perhaps you'll like it - it's called Wrest.

Related

AWS-SDK-RUBY stub a call to get_object

How do you stub a call to get_object using a client & encrypted client? Goal is to write rspec tests to get_object using the following clients. Does anyone have a "get_object" working example they can share? I am aware of various web pages that describe aws-sdk-ruby stubs but haven't been able to get anything working.
Aws::S3::Client.new
Aws::S3::Encryption::Client.new
Referring to this blog post you can use
# stub everything
Aws.config[:stub_responses] = true
which is supposed to prevent all http call.

How can I run a Controller Action from Rails Console, but setting the request.shot?

I'm working on a multi-tenant application, so pretty much everything throughout (starting with routing) expects to have a "request.host" that looks like "tenant_id.myapp.com".
I'm trying to run a controller action from the Rails console, but I haven't been able to figure this one out.
The easiest thing to do seems to be "app.get", but I can't figure out how to set the host.
I also saw an answer that mentions using "ActionController::TestProcess", which as far as I understand has been removed from Rails (or if not, I haven't found how to include it)
Any other options?
Thanks!
Daniel
I just verified it in my console(Pry)
# Send request with fake HTTP_HOST
>>app.get(app.root_path, nil, {"HTTP_HOST" => "123.myapp.com"})
>>#=>200
# Then check if it works
>>app.request.env
>>#...
>># "HTTP_HOST" : "123.myapp.com"

Debugging ActiveMerchant; need full request and response. How to?

Rails 3.0.10 and activemerchant gem 1.29.3
My app works fine in sandbox, but transactions in production mode are failing with "Security header is not valid", "ErrorCode"=>"10002"
We initiated a support request with paypal, after reviewing all the configuration parameters a million times and they feel we're hitting an incorrect endpoint. They've asked for a full trace for the transaction, including headers, etc, so I'm trying to figure out how to do that. I found this article
which suggested adding this to the config block
ActiveMerchant::Billing::PaypalGateway.wiredump_device = File.new(File.join([Rails.root, "log", "paypal.log"]), "a")
But that just results in an empty log; nothing gets dumped to it.
So, how can I obtain this info from the GATEWAY object, if possible? Here's the production config, the format of which is identical to what's used in staging env.
::GATEWAY = ActiveMerchant::Billing::PaypalGateway(
:login => 'me_api1.blah...',
:password => 'string...',
:signature => 'longer string...'
)
Thanks.
Needed to add the additional line as follows:
ActiveMerchant::Billing::PaypalGateway.wiredump_device.sync = true
Within the same config block in the environment
Somewhere in the class library you're using there should be a function to output this for you (if it's a well built library, that is.)
Even without that, though, you should be able to look in that PaypalGateway function to see where/how it's setting the endpoint. It's either hard-coding the value or it'll be setting different endpoints based on some sandbox option you have configured somewhere else in the class.
It's hard to tell you more than that without getting a look a the actual class library you're using, but I can concur that it must be either incorrect credentials or an incorrect endpoint. I've never once seen that security header error when it wasn't simply invalid credentials, which means either your values are incorrect or you're hitting the wrong endpoint.
If you want to post that whole function (or maybe even the whole library as the endpoint could be getting set from some other function) I can take a look and find the problem for you.

Coldfusion - Firstdata Global Gateway - Need help getting started

I’m using Coldfusion 9,0,0,251028 on Windows 7 64-bit.
I'm trying to change credit card processors for a website. I've read the integration guide for the Web Service API v 4.0, but it doesn't give me much in the way of how I integrate with coldfusion to build the xml that gets enclosed in SOAP and sent.
I've talked to Firstdata's second level support and was told they don't help with programming beyond troubleshooting error codes. They also told me they have no forum concerning the web service API.
What kind of tags in coldfusion would I use to start this transaction? Does anyone know where I could find an example or instructions besides the web service api integration guide?
Here's some recommended reading on doing SOAP with ColdFusion:
Making SOAP Web Service Requests With ColdFusion And CFHTTP
SOAP Request Functions
Troubleshooting SOAP Requests and Responses
I've always found SOAP to be a pain in the ass, but if that's the only way to go, the three links above should get you there.
You will want to look at cfobject and cfinvoke. I assume you have the WSDL url, so the first thing I would do is try that like this:
<cfobject webservice = "WSDL URL" name = "testCall" />
<cfdump var="#testCall#"/>
This should show you the available methods. Then you would call those message using cfinvoke:
<cfinvoke webservice = "#testCall#" method = "methodName" returnvariable="returnData" />
Then you could use the return data however you need. But a god start is to just dump it out and see what it looks like.
<cfdump var="#returnData#" />

Need guidance in creating Rails 3 Engine/Plugin/Gem

I need some help figuring out the best way to proceed with creating a Rails 3 engine(or plugin, and/or gem).
Apologies for the length of this question...here's part 1:
My company uses an email service provider to send all of our outbound customer emails. They have created a SOAP web service and I have incorporated it into a sample Rails 3 app. The goal of creating an app first was so that I could then take that code and turn it into a gem.
Here's some of the background: The SOAP service has 23 actions in all and, in creating my sample app, I grouped similar actions together. Some of these actions involve uploading/downloading mailing lists and HTML content via the SOAP WS and, as a result, there is a MySQL database with a few tables to store HTML content and lists as a sort of "staging area".
All in all, I have 5 models to contain the SOAP actions (they do not inherit from ActiveRecord::Base) and 3 models that interact with the MySQL database.
I also have a corresponding controller for each model and a view for each SOAP action that I used to help me test the actions as I implemented them.
So...I'm not sure where to go from here. My code needs a lot of DRY-ing up. For example, the WS requires that the user authentication info be sent in the envelope body of each request. So, that means each method in the model has the same auth info hard coded into it which is extremely repetitive; obviously I'd like for that to be cleaner. I also look back now through the code and see that the requests themselves are repetitive and could probably be consolidated.
All of that I think I can figure out on my own, but here is something that seems obvious but I can't figure out. How can I create methods that can be used in all of my models (thinking specifically of the user auth part of the equation).
Here's part 2:
My intention from the beginning has been to extract my code and package it into a gem incase any of my ESP's other clients could use it (plus I'll be using it in several different apps). However, I'd like for it to be very configurable. There should be a default minimal configuration (i.e. just models that wrap the SOAP actions) created just by adding the gem to a Gemfile. However, I'd also like for there to be some tools available (like generators or Rake tasks) to get a user started. What I have in mind is options to create migration files, models, controllers, or views (or the whole nine yards if they want).
So, here's where I'm stuck on knowing whether I should pursue the plugin or engine route. I read Jordan West's series on creating an engine and I really like the thought of that, but I'm not sure if that is the right route for me.
So if you've read this far and I haven't confused the hell out of you, I could use some guidance :)
Thanks
Let's answer your question in parts.
Part One
Ruby's flexibility means you can share code across all of your models extremely easily. Are they extending any sort of class? If they are, simply add the methods to the parent object like so:
class SOAPModel
def request(action, params)
# Request code goes in here
end
end
Then it's simply a case of calling request in your respective models. Alternatively, you could access this method statically with SOAPModel.request. It's really up to you. Otherwise, if (for some bizarre reason) you can't touch a parent object, you could define the methods dynamically:
[User, Post, Message, Comment, File].each do |model|
model.send :define_method, :request, proc { |action, params|
# Request code goes in here
}
end
It's Ruby, so there are tons of ways of doing it.
Part Two
Gems are more than flexible to handle your problem; both Rails and Rake are pretty smart and will look inside your gem (as long as it's in your environment file and Gemfile). Create a generators directory and a /name/name_generator.rb where name is the name of your generator. The just run rails g name and you're there. Same goes for Rake (tasks).
I hope that helps!