Search code examples
rubyif-statementopen-uri

Can't 'file.open.read' a url within a ruby if-block


I want to create a ruby script which will take barcodes from a text file, search a webservice for that barcode and download the result.

First I tried to test the webservice download. In a file when I hardcode the query things work fine:

result_download = open('http://webservice.org/api/?query=barcode:78686112327', 'User-Agent' => 'UserAgent [email protected]').read

It all works fine.

When I try to take the barcode from a textfile and run the query I run into problems.

IO.foreach(filename) {|barcode| barcode

website = "'http://webservice.org/api/?query=barcode:"+barcode.to_str.chomp + "', 'User-Agent' => 'UserAgent [email protected]'"

website = website.to_s



mb_metadata = open(website).read
}

The result of this is:

/home/user/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:37:in `initialize': No such file or directory @ rb_sysopen - http://webservice.org/api/?query=barcode:78686112327', 'User-Agent' => 'UserAgent [email protected]' (Errno::ENOENT)

I can't figure out if this problem occurs because the string I generate somehow isn't a valid url and ruby is trying to open a non-existent file, or is the issue that I am doing all this in a for loop and the file/url doesn't exist there. I have tried using open(website).write instead of open(website).read but that produces the same error.

Any help would be much appreciated.


Solution

  • The error message you get explicitly states, that there is no such file: http://webservice.org/api/?query=barcode:78686112327', 'User-Agent' => 'UserAgent [email protected]'.

    You try to pass all the parameters to open method using 1 big string (website), which is wrong. You should do it like that.

    IO.foreach(filename) do |barcode|
      website = "http://webservice.org/api/?query=barcode:#{barcode.to_str.chomp}"
      mb_metadata = open(website, 'User-Agent' => 'UserAgent [email protected]').read
    end