質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Cisco

シスコ(Cisco Systems,Inc.)は、アメリカ合衆国に本社を置く、世界最大のコンピュータネットワーク機器開発会社及び同社の製品

Q&A

解決済

2回答

404閲覧

railsでjsonを取得することができません

kozica

総合スコア58

GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Cisco

シスコ(Cisco Systems,Inc.)は、アメリカ合衆国に本社を置く、世界最大のコンピュータネットワーク機器開発会社及び同社の製品

0グッド

0クリップ

投稿2018/07/25 10:03

編集2018/07/26 05:17

前提・実現したいこと

cisco MerakiのScanning APIを使いPOSTされたjson形式のデータをRailsで取得したいです。

しかし、そのjsonを取得できません
rails側でエラーは出てないのですが、Merakiダッシュボードの方でエラーが表示されてます。

当方初心者なためそもそもrailsでjsonの取得のコーディングがあってるか怪しいです。

発生している問題・エラーメッセージ

Merakiダッシュボードで表示されてるエラー内容

”Did not match validator: http://wex01.cloud24.jp/personal_logs”

ruby

1#app/controllers/personal_logs_controller.rb 2validator ='xxxxxxxxxxxxxxxx' 3secret = 'xxxxxxxxxx' 4 5class PersonalLogsController < ApplicationController 6 skip_before_action :verify_authenticity_token 7 before_action :set_personal_log, only: [:show, :edit, :update, :destroy] 8 9 def presenceapi 10 if request.post? 11 map = JSON.parse(params[:data]).with_indifferent_access 12 if map[:secret] == secret 13 map[:probing].each do |p| 14 PersonalLog.create(ap_mac: p[:ap_mac], client_mac: p[:client_mac], 15 last_seen: DateTime.parse(p[:last_seen]), 16 rssi: p[:rssi]) 17 end 18 render :text => '' and return 19 else 20 Rails::logger.warn("*** MERAKI req with bad secret '#{map[:secret]}'") 21 rails 'access denied' 22 end 23 else 24 render :text => MERAKI_VALIDATOR 25 end 26 end 27end

ruby

1#config/routes.rb 2Rails.application.routes.draw do 3 match 'personal_logs', :to => 'personal_logs#presenceapi', :as => :personal_logs, :via => [:get, :post] 4end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Rails 5.1以降render :text =>''廃止されました

ruby

1render :plain => MERAKI_VALIDATOR

を利用してください

投稿2018/07/26 00:58

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kozica

2018/07/26 01:02

回答ありがとうございます! 上記の通り textからplainに変更して実行したところ Validated http://wex01.cloud24.jp/personal_logs と表示されました。 これは成功したということでしょうか?
kozica

2018/07/26 01:03

また、昨日も回答して頂き本当にありがとうございます!!
kozica

2018/07/26 01:10

rails側で下記エラーが出力されました ``` Started POST "/personal_logs" for 127.0.0.1 at 2018-07-26 10:07:07 +0900 (0.2ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 LoadError (Unable to autoload constant PersonalLog, expected /home/ユーザ名/workspace/working/webex/app/models/personal_log.rb to define it): ``` app/models/personal_log.rbに問題があるようですが、ここには何も書いてないのですが、何か記述が必要なのでしょうか?
asm

2018/07/26 01:35

エラーとしては、「定数PersonalLog(たぶんクラス)が見つからない」 なので、 「PersonalLog」でgrep検索して誰が参照してて、どこにあるのか を把握することが対処の第一歩
kozica

2018/07/26 01:51

$grep PersonalLog を実行したところ、処理が多いせいなのかずっと処理中なようで結果が得られてないです。 他に調べたところ、PersonalLogの記述ミスがないか調べてみます
asm

2018/07/26 01:58

git grep -w PersonalLog gitのgrepコマンドの方が検索対象絞れて速いかもしれませんね
kozica

2018/07/26 02:11

下記結果になりました。 $ sudo git grep -w PersonalLog fatal: Not a git repository (or any of the parent directories): .git
asm

2018/07/26 07:49

ありゃgitで管理してるわけじゃなかったのですね 申し訳ございません
guest

0

ベストアンサー

cisco Merakiはよく知らないのですが、Merakiダッシュボードに表示される(はずの)Validatorを、GETリクエストの際に返してやる必要があるようです。
「Did not match validator」というメッセージの意味はそういうことだと思われます。

書かれているコードの場合、presenceapiメソッドの最後の~~render :text => ''~~render :plain => ''''を、空文字ではなくValidatorを文字列として記述するようにしてみるとよさそうです。
※確かに別回答でasmさんが書かれてたようにrender :plainが正しそうですね。


初心者の方がいきなりいろいろやろうとすると難しそうなので、まずは単純にPOSTで送られてきたJSONデータを保存するところまでする、という想定で、イチから行うよう整理してみます。

rails newから始めると、だいたい以下のような流れになるかと思います。

shell

1rails new scanning-app 2cd scanning-app 3rails g scaffold Event data:text 4rails db:migrate

ここでscaffoldで作っているのは、dataというカラムにJSONのオブジェクトのうち、data:というキーの値を全部テキストとして保存する、という想定です。リクエストを受け取るURLが/eventsだそうなので、モデルはEvent、コントローラーはEventsControllerにしています。

こんな感じで用意して、app/controller/events_controller.rbは、

ruby

1class EventsController < ApplicationController 2 skip_before_action :verify_authenticity_token 3 4 VALIDATOR = "xxxxx" 5 6 def index 7 render :plain => VALIDATOR 8 end 9 10 11 def create 12 @event = Event.new(data: params[:data].to_s) 13 14 if @event.save 15 render :plain => "OK" 16 else 17 render :plain => "NG" 18 end 19 end 20end

みたいにします。VALIDATORは正しい値を入れてください。

ローカルで確認する場合は、

shell

1rails server

でサーバを立てると、http://localhost:3000/で立ち上がるはずです。
これで、curlを使って(curlがなければインストールしておいてください)、

shell

1curl http://localhost:3000/events

とすると、VALIDATORの文字列が帰ってくるはずです。同様に、POSTについては、

shell

1curl -X POST -H "Content-Type: application/json" -d '{"secret":"xxxx","version":"2.0","type":"DevicesSeen","data":{"a":"bbb"}}' http://localhost:3001/events

みたいな感じで適当にJSONを作ってPOSTリクエストを行ってみると、data:の値が保存されることが開発環境で確認できるかと思います。

これをproductionのサーバに持っていって、動作するのを確認したあとで、それからsecretの値チェックとか、data:の値をさらに項目ごとに分けてDBに保存するようにする、といったことを試してみるとよいかと思います。

投稿2018/07/25 12:34

編集2018/07/26 11:39
takahashim

総合スコア1877

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kozica

2018/07/26 00:19

回答ありがとうございます。 仰られたようにpresenceapiメソッドの最後の下記のように変更しましたが、同じ「Did not match validator」と表示されてしましました。 render :text => MERAKI_VALIDATOR
kozica

2018/07/26 00:32

初心者なりに原因を考えてみましたがどうでしょうか? ・def presenceapiメソッドはコントローラーに記述してますが、記述場所としてあってますか? ・presenceapi.html.erbにはなにか呼び出しなどの記述は必要ですか? ・models/personal_logのほうにpresenceapiメソッドを記述する必要はないですか? また、routes.rbも書き直したので投稿を修正致します。
kozica

2018/07/26 01:55

確かにそのようですね! 今は下記エラーと戦っております。 Started POST "/personal_logs" for 127.0.0.1 at 2018-07-26 10:07:07 +0900 (0.2ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 LoadError (Unable to autoload constant PersonalLog, expected /home/ユーザ名/workspace/working/webex/app/models/personal_log.rb to define it):
takahashim

2018/07/26 04:49

うーん、personal_logs_controller.rbですが、これってどうやって作られましたか? scaffoldしたんでしょうか。 ActiveRecordのモデルとして、PersonalLogクラスではなくPresenceクラスを使いたいのは何か理由があるんでしょうか。
kozica

2018/07/26 04:53

personal_logs_controller.rbはscaffoldして作ったと記憶してます。 PersonalLogクラスではなくPresenceクラスを使いたい理由はないので、変える必要があるならすぐに変えます。 当方初心者なためそこらへんの関係性もまだ完璧に把握できておりません、、、
kozica

2018/07/26 05:16

ご指摘にあったとおりPresence.createをPersonalLog.createに変更したのですが、同じエラーが返って来てしましました。
kozica

2018/07/26 05:20

エラーで指摘されている行をみてみると、 ``` map = JSON.parse(params[:data]).with_indifferent_access ``` この行を指摘されてるのでこの辺に原因があるのかなと思っています。 models/personal_log.rbには何か記述することがあるのでしょうか? 今何も記述してないのでそれも原因かと考えられます
kozica

2018/07/26 05:41 編集

あ、申し訳ありません エラー内容が違いました。 Processing by PersonalLogsController#presenceapi as HTML Parameters: {"version"=>"2.0", "secret"=>....... ・ ・ "rssi"=>17, "ipv6"=>nil, "manufacturer"=>"Rivet Networks"}]}}} Completed 500 Internal Server Error in 8ms (ActiveRecord: 0.8ms) TypeError (no implicit conversion of ActionController::Parameters into String): app/controllers/personal_logs_controller.rb:12:in `presenceapi' 上記エラー内容となっております
takahashim

2018/07/26 10:52

その辺から違っているのであれば根本的になんとかした方が良さそうですね…。 回答の方にあとで追記します。
kozica

2018/07/27 07:29

ものすごく細かく説明して頂き本当にありがとうございます!(泣) 無事うまく動いてeventテーブルにデータが格納されるようになりました! 本当にありがとうございました!!
takahashim

2018/07/27 08:29

無事に動いてよかったですね! もっともこれは最初のとっかかりで、最後のところに書いた通り、dataの項目に分けて保存したり、secretやtypeのチェックをしたり等が必要になるかと思いますが、一回動くところまでいけば、続きの作業もやりやすくなるかと思います。がんばってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問