POSTでIWEB_GetResponse()する時のISOURCEUTIL_SourceFromMemory()の使用方法 | developer.brewmp.com POSTでIWEB_GetResponse()する時のISOURCEUTIL_SourceFromMemory()の使用方法 | developer.brewmp.com

Developer

POSTでIWEB_GetResponse()する時のISOURCEUTIL_SourceFromMemory()の使用方法

Forums:

いつもお世話になっております。
POSTでIWEB_GetResponse()するところでつまづいております。
TARGET_URLに実際の繋ぎ先のURLを定義してます。
#define TARGET_URL "http://192.XXX.X.XXX/○○○/△△△.aspx?a=1"
のようにしてGETでサ−バ−側にHTTPで送信すると正しく到達します。
しかし、下記のコ−ドのようにしてPOSTで送信するとサ−バ側でコンテントが
受信されていません。
通信そのものはWebStatusでも1→2→3→4→5になっていますし、サ−バ−からの応答も
きちんとコ−ルバックで受信することができます。
ちなみにURLや通信で使用するインタ−フェ−スはコ−ルバックが終了するまで保持しています。

ISOURCEUTIL_SourceFromMemory()で生成したISourceインタ−フェ−スの
インスタンスをIWEB_GetResponse()の引数にする正しい方法に誤りがあるのでしょうか?
なにかお気づきの点がございましたら、ご教授していただけないでしょうか。
よろしくお願い致します。

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

void TEST::SendPostRequest(String request)
{
  // ISouceUtilインタ−フェ−スを生成出来た場合
  if(ISHELL_CreateInstance(m_pIShell, AEECLSID_SOURCEUTIL, (void**)&m_pISourceUtil) == SUCCESS)
  {
    // BODY部分のレングスを取得
    int length = request.length();
    // POST(BODY部分)するデ−タ
    char* pPostData = request.toChar();

    // メモリ−からデ−タを受け取る新しいISouceインタ−フェ−スオブジェクトを生成出来た場合
    if(ISOURCEUTIL_SourceFromMemory(m_pISourceUtil, pPostData, length, NULL, NULL, &m_pISource) == SUCCESS)
    {
      // コ−ルバックを初期化する
      CALLBACK_Init(&m_CallBack, (PFNNOTIFY)WebRespCB, this);

      // IWebインタ−フェ−スを生成出来た場合
      if(ISHELL_CreateInstance(m_pIShell, AEECLSID_WEB, (void**)&m_pIWeb) == SUCCESS)
      {
        // Webトランザクションの開始
        IWEB_GetResponse(m_pIWeb, (
               m_pIWeb,                  // IWebインタフェ−ス
               &m_pIWebResp,             // IwebRespインタ−フェ−ス
               &m_CallBack,                // AEECallback構造体(この構造体の中に受信後のコ−ルバックが設定されている)
               TARGET_URL,                // 接続先URL(レスポンスが返るまでメモリ上に存在する必要がある)
               WEBOPT_METHOD, "POST", // METHOD指定、デフォルトでGET
               WEBOPT_HEADER, "Content-Type: application/x-www-form-urlencoded; charset=Shift_JIS",
               WEBOPT_BODY, m_pISource, // POSTの送信デ−タ
               WEBOPT_CONTENTLENGTH, length, // BODY部分のレングス
               WEBOPT_STATUSHANDLER, WebStatusHandler, // 通信ステ−タスをチェックする関数をコ−ルバックに設定する
               WEBOPT_HANDLERDATA, this, //
               WEBOPT_END // パラメータ終わり
          ));
      }
    }
  }

通信先のサーバはどのような環境でしょうか?
おそらく、POSTするデータの中身がヘッダに合致しないために、サーバ側のServletなどがPOSTされたデータを無効なデータとして破棄しているものと思われます。
requestの中身が、WEBOPT_HEADER として指定している "Content-Type: application/x-www-form-urlencoded; charset=Shift_JIS" に合致するものであるかどうかご確認ください。
(IWebは、POSTするデータのエンコーディングなどは行いません。)

通信先のサーバはどのような環境でしょうか?
おそらく、POSTするデータの中身がヘッダに合致しないために、サーバ側のServletなどがPOSTされたデータを無効なデータとして破棄しているものと思われます。
requestの中身が、WEBOPT_HEADER として指定している "Content-Type: application/x-www-form-urlencoded; charset=Shift_JIS" に合致するものであるかどうかご確認ください。
(IWebは、POSTするデータのエンコーディングなどは行いません。)

ご指摘ありがとうございます。
通信先のサ−バですが、BREWアプリから受信したデ−タのヘッダ−部は
”Content-Type: application/x-www-form-urlencoded; charset=Shift_JIS”として
受信しています。
また、BREWアプリ側ですが、先のソ−スの void TEST::SendPostRequest(String request) の引数
【String request】の中身は文字コ−ドとしてShift_JISを使用したcharの配列になっています。
実際にPOSTで送信しようとしているデ−タは ”a=0” なので特にURLエンコ−ドはしていません。
ISOURCEUTIL_SourceFromMemory()の第二引数はAECHARの配列のポインタにする必要はないですよね?
WEBOPT_HEADER, の "Content-Type: application/x-www-form-urlencoded; charset=Shift_JIS", も
defineで定義して通信後も保持しています。
WEBOPTの設定に誤りがあるのか、ISOURCEUTIL_SourceFromMemory() の使用法に誤りがあるのか
理解できていません。
例えば、 http://www.google.co.jp/ にSEARCH=aaa をPOSTで送信したい場合に
どのように ISOURCEUTIL_SourceFromMemory() と IWEB_GetResponse() を使用すればよいのでしょうか?
よろしくお願いします。

ご指摘ありがとうございます。
通信先のサ−バですが、BREWアプリから受信したデ−タのヘッダ−部は
”Content-Type: application/x-www-form-urlencoded; charset=Shift_JIS”として
受信しています。
また、BREWアプリ側ですが、先のソ−スの void TEST::SendPostRequest(String request) の引数
【String request】の中身は文字コ−ドとしてShift_JISを使用したcharの配列になっています。
実際にPOSTで送信しようとしているデ−タは ”a=0” なので特にURLエンコ−ドはしていません。
ISOURCEUTIL_SourceFromMemory()の第二引数はAECHARの配列のポインタにする必要はないですよね?
WEBOPT_HEADER, の "Content-Type: application/x-www-form-urlencoded; charset=Shift_JIS", も
defineで定義して通信後も保持しています。
WEBOPTの設定に誤りがあるのか、ISOURCEUTIL_SourceFromMemory() の使用法に誤りがあるのか
理解できていません。
例えば、 http://www.google.co.jp/ にSEARCH=aaa をPOSTで送信したい場合に
どのように ISOURCEUTIL_SourceFromMemory() と IWEB_GetResponse() を使用すればよいのでしょうか?
よろしくお願いします。

もしかしてSendPostRequestに渡しているrequest値の寿命の問題ではないでしょうか。
WebOptsリスト内のpValsを表すポインタは応答コールバックが送られるまで有効でなければ
ならないそうです(apiリファレンス「WEBOPTの寿命に関する注意事項」より)。

もしかしてSendPostRequestに渡しているrequest値の寿命の問題ではないでしょうか。
WebOptsリスト内のpValsを表すポインタは応答コールバックが送られるまで有効でなければ
ならないそうです(apiリファレンス「WEBOPTの寿命に関する注意事項」より)。

ソース上、特に問題となるところは見当たりません。
pPostDataの寿命(requestの寿命と同じでしょうか)が気になりますが、requestはレスポンスの取得時まで有効でしょうか? (ISOURCEUTIL_SourceFromMemory()に渡すメモリは、内部でコピーされませんので、全て読み出されるまでの間有効である必要があります。)

ソース上、特に問題となるところは見当たりません。
pPostDataの寿命(requestの寿命と同じでしょうか)が気になりますが、requestはレスポンスの取得時まで有効でしょうか? (ISOURCEUTIL_SourceFromMemory()に渡すメモリは、内部でコピーされませんので、全て読み出されるまでの間有効である必要があります。)

Originally posted by trixter
もしかしてSendPostRequestに渡しているrequest値の寿命の問題ではないでしょうか。
WebOptsリスト内のpValsを表すポインタは応答コールバックが送られるまで有効でなければ
ならないそうです(apiリファレンス「WEBOPTの寿命に関する注意事項」より)。
ご意見ありがとうございます。
WEBOPT_METHOD,  WEBOPT_HEADER,  WEBOPT_BODY,
WEBOPT_CONTENTLENGTH,  WEBOPT_STATUSHANDLER,
の各値はコ−ルバック終了後まで保持しています。WEBOPT_COPYOPTSは
リファレンスに記述されているようにメモリ不足を考慮し、使用していません。
BREWアプリ側から 'A' をPOSTで送信し、サ−バ側で受信したデ−タをダンブしてみると、
********************************************************************
POST /pdc/cmd.aspx HTTP/1.0
Host: 192.×××.×.×××
User-Agent: BREW/2.1.0.20 (built May 9 2003)
Content-Length: 44
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded; charset=Shift_JIS
L・
**********************************
[4C][F7][12][00][E3][32][D1][77]
[78][F7][12][00][D9][8B][CF][77]
[00][F0][FD][7F][78][F7][12][00]
[5A][88][CF][77][38][F7][12][00]
[2A][88][CF][77][86][01][00][00]
[E3][32][D1][77]
********************************************************************
となっています。 サ−バ側は単にバイトのストリ−ムとしてデ−タを受信させているので
やっぱりBREWアプリで ISOURCEUTIL_SourceFromMemory() を使用して生成した
ISource * * ppis に問題があると考えているのですがどうでしょうか?

Originally posted by trixter
もしかしてSendPostRequestに渡しているrequest値の寿命の問題ではないでしょうか。
WebOptsリスト内のpValsを表すポインタは応答コールバックが送られるまで有効でなければ
ならないそうです(apiリファレンス「WEBOPTの寿命に関する注意事項」より)。
ご意見ありがとうございます。
WEBOPT_METHOD,  WEBOPT_HEADER,  WEBOPT_BODY,
WEBOPT_CONTENTLENGTH,  WEBOPT_STATUSHANDLER,
の各値はコ−ルバック終了後まで保持しています。WEBOPT_COPYOPTSは
リファレンスに記述されているようにメモリ不足を考慮し、使用していません。
BREWアプリ側から 'A' をPOSTで送信し、サ−バ側で受信したデ−タをダンブしてみると、
********************************************************************
POST /pdc/cmd.aspx HTTP/1.0
Host: 192.×××.×.×××
User-Agent: BREW/2.1.0.20 (built May 9 2003)
Content-Length: 44
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded; charset=Shift_JIS
L・
**********************************
[4C][F7][12][00][E3][32][D1][77]
[78][F7][12][00][D9][8B][CF][77]
[00][F0][FD][7F][78][F7][12][00]
[5A][88][CF][77][38][F7][12][00]
[2A][88][CF][77][86][01][00][00]
[E3][32][D1][77]
********************************************************************
となっています。 サ−バ側は単にバイトのストリ−ムとしてデ−タを受信させているので
やっぱりBREWアプリで ISOURCEUTIL_SourceFromMemory() を使用して生成した
ISource * * ppis に問題があると考えているのですがどうでしょうか?

Content-Lengthが44となっていることが既におかしいように思われます。ここには、WEBOPT_CONTENTLENGTHで指定する値そのものが入ります。
String::length と String::toChar の実装をご確認いただけますでしょうか?

Content-Lengthが44となっていることが既におかしいように思われます。ここには、WEBOPT_CONTENTLENGTHで指定する値そのものが入ります。
String::length と String::toChar の実装をご確認いただけますでしょうか?

Originally posted by ykubo
Content-Lengthが44となっていることが既におかしいように思われます。ここには、WEBOPT_CONTENTLENGTHで指定する値そのものが入ります。
String::length と String::toChar の実装をご確認いただけますでしょうか?
いつもご教授していただきありがとうございます。
先ほどのContent-Lengthはこちらに コピ−する際の誤記でした。すみません。
基本的な質問でスミマセンが、例えば、char sample = 'A'; をPOSTで送信しようとした場合、コンテントレングスは1byteでよいのでしょうか?
それとも、char sample[2] = "A"; として、 ヌル文字の分も考慮して2byteにするものなのでしょうか?
私の認識では、STRLEN()のサイズでよいと思っています。
現在、【String request】 は無視してメインクラスのpublic のメンバ変数 char m_postData[128]に送信デ−タ 'A' を格納して
それを ISOURCEUTIL_SourceFromMemory()で ISourceのインスタンスを生成し、
IWEB_GetResponse()で送信させていますが、POSTデ−タをサ−バ側に正しく送ることができていない状況です。
もちろんISource のポインタを受け取る変数も、同様に public メンバ変数 m_pISource に格納しています。
ISOURCEUTIL_SourceFromMemory()を使用せずに動的な文字デ−タを
IWEB_GetResponse()のPOSTで送信する方法はあるのでしょうか?
GETでは正常に送信できるので、通信全般の処理が根本的に間違っているというよりも、POSTの設定関連にミスがあると思っています。
度々すみませんがよろしくお願い致します。

Originally posted by ykubo
Content-Lengthが44となっていることが既におかしいように思われます。ここには、WEBOPT_CONTENTLENGTHで指定する値そのものが入ります。
String::length と String::toChar の実装をご確認いただけますでしょうか?
いつもご教授していただきありがとうございます。
先ほどのContent-Lengthはこちらに コピ−する際の誤記でした。すみません。
基本的な質問でスミマセンが、例えば、char sample = 'A'; をPOSTで送信しようとした場合、コンテントレングスは1byteでよいのでしょうか?
それとも、char sample[2] = "A"; として、 ヌル文字の分も考慮して2byteにするものなのでしょうか?
私の認識では、STRLEN()のサイズでよいと思っています。
現在、【String request】 は無視してメインクラスのpublic のメンバ変数 char m_postData[128]に送信デ−タ 'A' を格納して
それを ISOURCEUTIL_SourceFromMemory()で ISourceのインスタンスを生成し、
IWEB_GetResponse()で送信させていますが、POSTデ−タをサ−バ側に正しく送ることができていない状況です。
もちろんISource のポインタを受け取る変数も、同様に public メンバ変数 m_pISource に格納しています。
ISOURCEUTIL_SourceFromMemory()を使用せずに動的な文字デ−タを
IWEB_GetResponse()のPOSTで送信する方法はあるのでしょうか?
GETでは正常に送信できるので、通信全般の処理が根本的に間違っているというよりも、POSTの設定関連にミスがあると思っています。
度々すみませんがよろしくお願い致します。

自己解決いたしました。ありがとうございました。

自己解決いたしました。ありがとうございました。