Извлечение данных из REST в Rails - PullRequest
3 голосов
/ 14 июля 2011

Это длинный вопрос, поэтому я прошу прощения, если потребуется время, чтобы понять. Я сделаю это максимально простым.

Я начинаю немного отчаяться, но я так близко. Некоторое время я боролся с Ruby и общался с post и net :: http. Итак, на данный момент у меня есть хеш, превращаемый в JSON. отправлено по сети с помощью почтового запроса от net :: http, а затем я пытаюсь превратить его обратно в объект.

Один маршрут, который я исследовал, был активной записью и активным ресурсом, но после некоторых проблем с ними обе стороны решили определить мою собственную модель, а затем выяснить, как преобразовать и отправить ее.

Моя модель

Эта модель называется customRequest. Внутри него есть post_me, который переводит 2 переменные классов в хеш, превращает их в json, а затем отправляет.

class CustomRequest
  require 'json'
  require 'net/http'
  attr_accessor :myString, :myInteger

  def initialize(myString,myInteger)
    @myString = myString
    @myInteger = myInteger
  end

  def post_me

    @myReq = {:myString => @myString, :myInteger =>@myInteger}
    myJsonReq = @myReq.to_json
    #myJsonReq = JSON.generate(@myReq)
    puts myJsonReq
    #    res = Net::HTTP.post_form(URI.parse('http://127.0.0.1:3008/user_requests/add'),
    #    myJsonReq)

    res = Net::HTTP.post_form(URI.parse('http://127.0.0.1:3008/user_requests/add.json'),
    myJsonReq).as_json
  end
end

Так вот в двух словах пользовательский запрос.

Вопросы

Биты, которые меня беспокоят:

  1. Получив URL, я написал add.json, так как формат определяется в маршруте контроллера. Я не знаю, если это необходимо?
  2. Лучше ли генерировать хеш из переменных и отправлять его на реконструкцию или лучше преобразовать весь класс в _json и отправить его?

Если я создаю класс как есть в консоли rails и отправляю его, я получаю хорошие 200 и ответ в терминале.

Подробнее

(ПРИМЕЧАНИЕ: читайте этот бит, только если вы действительно хотите знать, что происходит в сценах)

@test.post_me
{"myInteger":300,"myString":"testestest"}
=> {"x-ua-compatible"=>["IE=Edge"], "etag"=>["\"d41d8cd98f00b204e9800998ecf8427e\""], "connection"=>["Keep-Alive"], "content-type"=>["application/json; charset=utf-8"], "date"=>["Thu, 14 Jul 2011 15:54:24 GMT"], "server"=>["WEBrick/1.3.1 (Ruby/1.8.7/2009-06-12)"], "x-runtime"=>["0.022517"], "content-length"=>["0"], "set-cookie"=>["_webApp_session=BAh7BiIPc2Vzc2lvbl9pZCIlZTJmM2IwYmVhZWMwM2E2ZGQzNWEwMDUwNmE2NDhlM2U%3D--5312eec4795d9f0633520c01992422e9c15746e4; path=/; HttpOnly"], "cache-control"=>["max-age=0, private, must-revalidate"]}
>> 

Вот тот же ответ, если я не конвертирую его в Json:

{"myInteger":300,"myString":"testestest"}
=> #<Net::HTTPOK 200 OK  readbody=true>

Пожалуйста, если бы кто-то мог ответить на вопросы 1 и 2, я был бы рад


Серверная сторона

Вот серверная сторона, которая должна принять запрос и превратить его обратно в Json и объект. Я пробовал кучу разных вещей, большинство из которых было закомментировано.

Обычно я получу ответ 200 с подробной информацией в теге, но когда я попытаюсь поместить хеш-объект, я ничего не получу /

Started POST "/user_requests/add" for 127.0.0.1 at Thu Jul 14 16:56:07 +0100 2011
  Processing by UserRequestsController#add_request as 
  Parameters: {"{\"myInteger\":300,\"myString\":\"testestest\"}"=>""}
Rendered user_requests/add_request.json.erb (0.3ms)
Completed 200 OK in 31ms (Views: 27.4ms | ActiveRecord: 0.0ms)

Вот множественная попытка разорвать его и превратить обратно в объект.

  def add_request
    require 'rubygems'
    require 'json'

    #@custom = CustomRequest.new(params[:custom]) 
    #@custom = CustomRequest.new(JSON.parse(params[:custom]))
    #@custom = CustomRequest.new(params[:custom]).from_json
    #@custom = CustomRequest.new(params[:custom].from_json) 


     @myHash = Hash.new(params[:myHash])
     #@myHash = Hash.new(JSON.parse(params[:myHash]))
    #@myHash = Hash.new(params[:myHash]).from_json
    #@myHash = Hash.new(params[:myHash].from_json) 


     puts "IT WORKS!"
     puts @myHash.to_s

Они все в значительной степени одинаковы, за исключением того, что я пытался воссоздать объект из отправленного хэша, а другой пытался воссоздать hash_to_json в hash_from_json

Больше вопросов

Итак:

  1. Правильно ли я создаю объект с помощью params (: myHash) или я должен ссылаться на каждую переменную по отдельности?
  2. - это параметры, автоматически возвращаемые в читаемый формат, или мне нужно добавить или проанализировать JSON. В связи с этим, имеет ли значение, какой я использую?
  3. Правильно ли я восстанавливаю объект, почему на моем экране ничего не отображается?
  4. (необязательно). Есть ли какие-нибудь простые способы сохранить его в таблице после этого?

1 Ответ

2 голосов
/ 22 июля 2011

Короткий ответ - сломать все. Я превратил свой класс в хэш, а затем в Джсона. Вернитесь из Json и воссоздайте объект.

КОНТРОЛЛЕР на стороне сервера ::

class UserRequestsController < ApplicationController
  # POST /user_requests
  # POST /user_requests.xml
  def add_request
    require 'rubygems'
    require 'json'
    #@user_request = UserRequest.new(params[:user_request])
    #@user_request = UserRequest.new(JSON.parse(params[:user_request]))
    #@user_request = UserRequest.new(params[:user_request].from_json)

    #puts @user_request

    #@custom = CustomRequest.new(params[:custom])
    #@custom = CustomRequest.new(JSON.parse(params[:custom]))
    #@custom = CustomRequest.new(params[:custom]).from_json
    #@custom = CustomRequest.new(params[:custom].from_json)

    @myHash = Hash.new()
    @myHash = params
    #puts (params[:url])

    #puts YAML::dump(params)
    # puts YAML::dump(params[:url])
    #@myHash = Hash.new(JSON.parse(params[:myHash]))
    #@myHash = Hash.new(params[:myHash]).from_json
    #@myHash = Hash.new(params[:myHash].from_json)

    puts "IT WORKS!"

    #puts @myHash
    #puts YAML::dump(@myHash)
    #@myHash.each { |k,v| puts "#{k} => #{v}" }\

    #@user_request = CustomRequest.new(@myHash[:url],@myHash[:depth])
    #@user_request = CustomRequest.new(@myHash[:url],@myHash[:depth])
    #@user_request = CustomRequest.new(Time.now,Time.now,params[:depth],params[:depth],nil)

    # Had to manually create the record because it couldnt take it from a single param
    @user_request = CustomRequest.create(:created_at =>Time.now,
    :updated_at => Time.now,
    :depth => @myHash[:depth],#myHash is the params broken into a hash
    :url => @myHash[:url],
    :status => "Yet to be crawled")

    puts  "YAML DUMP CUSTOM OBJECT"
    puts  YAML::dump(@user_request)

    respond_to do |format|
      if @user_request.save
        format.json { render :json => @myHash, :status => :created}
      else if @myHash.nil?
          format.json  { render :json => @user_request.errors, :status => :unprocessable_entity }
        #ß  format.xml  { render :xml => @user_request, :status => :created}#, :location => @user_request }
        else
          format.json  { render :json => @user_request.errors, :status => :unprocessable_entity }
        #ß  format.xml  { render :xml => @user_request, :status => :created}#, :location => @user_request }
        end
      end
    end

Способ размещения модели на стороне клиента:

  def post_me

        res = Net::HTTP.post_form(URI.parse('http://127.0.0.1:3008/user_requests/add.json'),
                                  {'url' =>'UserRequest::url'}).as_json
...