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

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

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

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

GET

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

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Q&A

1回答

963閲覧

Mechanizeでのgetメソッドを利用したリクエストが何故か複数回実行されてしまう

Daimian

総合スコア53

Ruby on Rails 5

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

GET

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

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

0グッド

0クリップ

投稿2018/12/10 05:30

実行したこと

下記associationモジュールのkick_crmメソッドにkick_crm(:get, "hoge.com")のような形で引数を与えリクエストを行っています。リクエスト実行後、動作が少し遅いなと思い、AWSのX-Rayという解析ツールで解析を行ったところ、kick_crm(:get, "hoge.com")というコマンドを一度実行しただけにも関わらず、3回もリクエストが実行されておりました。

正確に申し上げれば、その3回のうち2回は401の認証エラーではじかれており、最後の1回が200でリクエスト成功しておりました。

質問

①何故、3回リクエストがされてしまうのでしょうか?
(推測で構いません。全く原因が分かりません。どんな情報でもヒントになります。お助け願います)

②リクエストが一度だけ送信されるように変更したいのですが、どのような対処が必要だと思いますか?
(こちらも推測で結構です。何かヒントをいただければ幸いです。mechanizeを使用することがそもそもダメだという場合は、何か代替案をご教示いただければ幸いです。。)

該当のソースコード

ruby

1 module Association 2 # 各種初期化を実施して接続用インスタンスを返す 3 def connect() 4 m = MechanizeExtension.new 5 m.add_auth(WEB_API_BASE_URL, CRM_SETTINGS["userName"], CRM_SETTINGS["password"], nil, CRM_SETTINGS["domain"]) 6 m 7 end 8 9 # web apiリクエスト時のヘッダ設定 10 def _add_base_header() 11 header = { 12 'Accept' => 'application/json', 13 'Content-Type' => 'application/json; charset=utf-8', 14 'OData-MaxVersion' => '4.0', 15 'OData-Version' => '4.0', 16 'Prefer' => %Q(odata.maxpagesize=#{CRM_MAX_PAGE_SIZE},odata.include-annotations="*") 17 } 18 end 19 20 # web apiへのリクエスト送信 21 def kick_crm(method, requestUrl, *recordObject) 22 connection = connect 23 case method 24 when :get 25 response = connection.send(method, requestUrl, [], nil,_add_base_header) 26 when :post, :patch 27 response = connection.send(method, requestUrl, _add_base_header, JSON.generate(recordObject[0]) ) 28 end 29 rescue Exception => e 30 Rails.logger.error "エラー発生: #{e}" 31 false 32 end 33 end # Association

X-ray分析結果

X-ray分析結果

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

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

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

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

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

guest

回答1

0

推測で構いません

ということなので(そんな理由でrubyに首を突っ込むのは間違ってるが)
気になったところを一つ。

ruby

1case method 2when :get 3 response = connection.send(method, requestUrl, [], nil,_add_base_header) 4when :post, :patch 5 response = connection.send(method, requestUrl, _add_base_header, JSON.generate(recordObject[0]) ) 6end

見た限り、どちらも同じような内容をやっているので、post, patch のところを出力にしてテストしてみてはどうでしょうか。
(rubyなんてやったことないので間違えてたら低評価でも何でもどうぞ)

投稿2018/12/10 05:55

yukkuri

総合スコア624

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

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

Daimian

2018/12/10 06:09

ありがとうございます!試してみます!低評価にする理由なんて微塵もありません。ありがとうございます!該当モジュールを全部掲載した方がいいかと思い、:post :patchのメソッド部分も書いてしまいましたが、今回指定しているのはgetメソッドの部分ですので、そもそもご指摘いただいたpostとpatchメソッドは作動していないはずです。。が、とりあえず試します。すいませんありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問