前回書いたように、C/C++でWebサービスにPOSTするモジュールを作り直すことに。
作った人間がもういなくなったので/誰も直してくれないので、自分で直すしかない。
該当ソースを見ると、WinInetを使って、IntenetOpen()した後、InternetOpenUrl()している。確かにこれだとGETになってしまうはず。
調べてみると、いくつか該当記事が見つかりました。
Windows API, WinInetによるPOST
Is there any good example of http upload using WinInet c++ library
HTTP/HTTPSでPOST(wininet.dll)
基本的には同じで、
InternetOpen()
InternetConnect()
HttpOpenRequest()
HttpSendRequest()
の順に処理をする。POSTだけでなく、GETとか他のメソッドにも使えるらしいので、基本的にはこれで共通関数にすれば使い回しできるかと。
上記の例では、全て、TCHARで文字を処理しているのだけれど、自分の扱っているものでは、全てchar型で処理してもOKでした。これは、HttpSendRequest()=HttpSendRequestA()になっているあたりとも関係していると思いますが、厳密には追いきれていない。
また、 HttpSendRequest()の際、lpOptional部分はBASE64でエンコードしないと、文字化けするので注意。
2014年7月31日木曜日
2014年7月29日火曜日
スラッシュ(%2F)を含むURLがNOT FOUNDでエラーとなる
オフショアに作ってもらった、C/C++ベースでWebサービスを利用するモジュールをテストしていたら、さくさくと動いていたのだけれど、なぜか404 NOT FOUNDエラーが返ってくるようになった。そのWebサービスはRESTで、JSON形式でデータを渡してDB登録させるもの。
おかしいなー、と思っていろいろと試行錯誤した結果、JSON形式のデータにスラッシュ(/)が入っているとエラーとなることが判明。つまり、エンコードされた文字列に%2Fが入っているかたちです。
ググってみると、以下の記事が引っかかりました。
ApacheのAllowEncodedSlashesをOnにして、URLに「%2F(スラッシュ)」があっても404エラーにならないようにする。
Apacheではなかったのだけれど、サーバーの設定を見てもらうと、同じ設定があって、見事にOff。
うーん、サーバーの設定漏れか、と思ったのだが、どうも違うらしい。
同じサーバーに対して、別のWebサービスでスラッシュを入れて、別の.NETモジュールからデータ登録してみたのだけれど、そちらはOK。何故だ。
よくよく聞くと、C/C++ベースでのモジュールではGETメソッドを使って投げているが、.NETモジュールはPOSTメソッドを使っているとのこと。
まあ、今回の場合、DB登録させるので、確かにRESTfulサービスとしては、POSTメソッドが正しい。つまり、AllowEncodedSlashesは、Offで合っている。(でも、Webサービス作った人間に聞いたら、GET/POSTどちらでも良い(正しいRESTfulサービスにはなっていない)と言っていたのだが。。。)。
考えられる対処方法は2つ。
・C/C++モジュールを作り直す
・AllowEncodedSlashesをOnにする
まずは素直に、前者にチャレンジすることにしよう。
おかしいなー、と思っていろいろと試行錯誤した結果、JSON形式のデータにスラッシュ(/)が入っているとエラーとなることが判明。つまり、エンコードされた文字列に%2Fが入っているかたちです。
ググってみると、以下の記事が引っかかりました。
ApacheのAllowEncodedSlashesをOnにして、URLに「%2F(スラッシュ)」があっても404エラーにならないようにする。
Apacheではなかったのだけれど、サーバーの設定を見てもらうと、同じ設定があって、見事にOff。
うーん、サーバーの設定漏れか、と思ったのだが、どうも違うらしい。
同じサーバーに対して、別のWebサービスでスラッシュを入れて、別の.NETモジュールからデータ登録してみたのだけれど、そちらはOK。何故だ。
よくよく聞くと、C/C++ベースでのモジュールではGETメソッドを使って投げているが、.NETモジュールはPOSTメソッドを使っているとのこと。
まあ、今回の場合、DB登録させるので、確かにRESTfulサービスとしては、POSTメソッドが正しい。つまり、AllowEncodedSlashesは、Offで合っている。(でも、Webサービス作った人間に聞いたら、GET/POSTどちらでも良い(正しいRESTfulサービスにはなっていない)と言っていたのだが。。。)。
考えられる対処方法は2つ。
・C/C++モジュールを作り直す
・AllowEncodedSlashesをOnにする
まずは素直に、前者にチャレンジすることにしよう。
2014年7月8日火曜日
Window7でダンプを取得する
過去、何度かやっているのですが、都度、やり方を忘れてしまって周囲に聞きまくってしまうので、備忘録がてら書いておきます。
アプリケーションが異常終了した場合の調査をするには、やはりダンプ解析が手っ取り早いです。どこで落ちたか、一瞬で判別できるのが魅力。
で、その設定方法なんですけど、Windows7とかだと、WER(Windows Error Reporting)機能を使わないといけない。
WER Settings
基本的には上記なんですが、日本語化と手順化した記事がこちら。
ワトソンログの設定がおこなえない
ポイントとしては、Windows7ではエラー報告を無効にしなければいけない。私の端末では、「コントロールパネル」⇒「アクションセンター」⇒「トラブルシューティング」⇒「設定の変更」 でコンピュータ保守を無効にしました。微妙に違って、探すのに少しばかり苦労しました。
あとは言われたとおり、レジストリを操作します。HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/Windows Error Reporting/LocalDumpsキーの下に、DumpTypeやDumpCount、DumpFolderなんかを指定します。
念のため、これも忘れないように書いておくと、めでたくダンプファイルが取得できたら、以下を1つの端末に揃える。可能であれば、ビルド端末を使うと話が早い。
・実行時のモジュールを、実行時のパスに置く(デバッグ時にシンボルを読み込む)
・ビルド時のソースを、ビルド時のパスに置く
・ビルド時の中間ファイルを、ビルド時のパスに置く
・ダンプファイルを、どこか適当に置く
以上で、ダンプファイルによる解析の準備が完了。
アプリケーションが異常終了した場合の調査をするには、やはりダンプ解析が手っ取り早いです。どこで落ちたか、一瞬で判別できるのが魅力。
で、その設定方法なんですけど、Windows7とかだと、WER(Windows Error Reporting)機能を使わないといけない。
WER Settings
基本的には上記なんですが、日本語化と手順化した記事がこちら。
ワトソンログの設定がおこなえない
ポイントとしては、Windows7ではエラー報告を無効にしなければいけない。私の端末では、「コントロールパネル」⇒「アクションセンター」⇒「トラブルシューティング」⇒「設定の変更」 でコンピュータ保守を無効にしました。微妙に違って、探すのに少しばかり苦労しました。
あとは言われたとおり、レジストリを操作します。HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/Windows Error Reporting/LocalDumpsキーの下に、DumpTypeやDumpCount、DumpFolderなんかを指定します。
念のため、これも忘れないように書いておくと、めでたくダンプファイルが取得できたら、以下を1つの端末に揃える。可能であれば、ビルド端末を使うと話が早い。
・実行時のモジュールを、実行時のパスに置く(デバッグ時にシンボルを読み込む)
・ビルド時のソースを、ビルド時のパスに置く
・ビルド時の中間ファイルを、ビルド時のパスに置く
・ダンプファイルを、どこか適当に置く
以上で、ダンプファイルによる解析の準備が完了。
2014年7月6日日曜日
NEXUS7にUSB接続する
Nexus7買いました。買ったといっても、出張で稼いだ楽天ポイントで入手しただけですが。2013と2012があったのですが、2012の方が安かったので2012を購入。開発したアプリの動作検証環境が欲しかっただけなので、特にスペックは気にしません。
で、自作のアプリを動かしてみようということになったわけですが、USB経由でインストールできません。きちんと以下の設定を行ったのに。まあ、最初、これすら分からなくてパニクッってしまいましたが。
新型Nexus7(2013)の開発者オプションを表示させてUSBデバッグをオンにする方法。
なぜかと考えてみるに、コンピューターにNexus7が認識されていないことに気づき、ググって以下の記事に遭遇。
nexus7 2013において、nexus7とPCをUSBケーブルで繋いでも、PC側に認識されません
そういうことかと思い、やってみましたが、デバイスと合っていないといわれてNG。どうやらこれは、2013でないと駄目らしい。
ということで、2012で再度調査すると、今度は以下の記事に遭遇。
Nexus7のドライバインストール方法。
これでやってみるが、最新のものだと、USBドライバーのインストールからなぜかADBドライバーのインストールが起動され、うまくいかない。
何故かなー、と思いつつ、画面に表示されているコメントを読むと、MTPモードとPTPモードがあって、PTPに切り替えるとうまくいくことがあるらしい。
以下のリンクを見て操作してみると、MTPモードすら設定されていなかったので、まずはMTPモードでチャレンジ。
【Android】USB接続時のMTP/PTPモードを切替える方法
それで駄目だったので、PTPモードに切り替える。。。とPCが識別!!!
結構、手間取りましたが、何とかADBインストールできました。
で、自作のアプリを動かしてみようということになったわけですが、USB経由でインストールできません。きちんと以下の設定を行ったのに。まあ、最初、これすら分からなくてパニクッってしまいましたが。
新型Nexus7(2013)の開発者オプションを表示させてUSBデバッグをオンにする方法。
なぜかと考えてみるに、コンピューターにNexus7が認識されていないことに気づき、ググって以下の記事に遭遇。
nexus7 2013において、nexus7とPCをUSBケーブルで繋いでも、PC側に認識されません
そういうことかと思い、やってみましたが、デバイスと合っていないといわれてNG。どうやらこれは、2013でないと駄目らしい。
ということで、2012で再度調査すると、今度は以下の記事に遭遇。
Nexus7のドライバインストール方法。
これでやってみるが、最新のものだと、USBドライバーのインストールからなぜかADBドライバーのインストールが起動され、うまくいかない。
何故かなー、と思いつつ、画面に表示されているコメントを読むと、MTPモードとPTPモードがあって、PTPに切り替えるとうまくいくことがあるらしい。
以下のリンクを見て操作してみると、MTPモードすら設定されていなかったので、まずはMTPモードでチャレンジ。
【Android】USB接続時のMTP/PTPモードを切替える方法
それで駄目だったので、PTPモードに切り替える。。。とPCが識別!!!
結構、手間取りましたが、何とかADBインストールできました。
登録:
投稿 (Atom)