- ベストアンサー
wininetでPOSTで値を渡せません
- wininetを使ってPOST形式でサーバにパラメータを渡す方法がわかりません。
- HttpOpenRequestかHttpSendRequestに問題があると思いますが、解決策がわかりません。
- 環境はvc++2005です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
なるほど、第2引数と第4引数で指定されたものはそのように出力されるのですか…。 第2引数では追加のリクエストヘッダ(複数の場合はおそらく\r\nで結合して)を、第4引数ではHTTPBodyに相当するものを…ですか。 MSDNによると… 第3引数は >dwHeadersLength >[in] Size of the additional headers, in TCHARs. If this parameter is -1L and lpszHeaders is not NULL, the function assumes that lpszHeaders is zero-terminated (ASCIIZ), and the length is calculated. See Remarks for specifics. ということでTCHAR単位で、第5引数は >dwOptionalLength >[in] Size of the optional data, in bytes. This parameter can be zero if there is no optional data to send. ということでByte単位で渡す必要があるようです。 sizeof( param ) では、param[]には'\0'も含まれるので14になったようです。 wchar_t配列ではなく、charの配列でstrlen()でよいのではないでしょうか?
その他の回答 (1)
- Wr5
- ベストアンサー率53% (2173/4061)
とりあえず、WireSharkなどでどのように送られいるか確認してみてはどうでしょう? WinInet系のAPIは使ったことないのですが… >wchar_t param[] = L"type=1"; >wchar_t header[] = L"Content-Type: application/x-www-form-urlencoded"; >flag = HttpSendRequest( hRequest, header, wcslen( header ), param, wcslen( param )); だと、POSTリクエストには Content-Type: application/x-www-form-urlencoded: type=1 と送られているような気がするのですが…。 header[]に記述されている分がリクエストヘッダの名前("Host:"とか"User-Agent:"とか)で、param[]に記述されているのがそのパラメータ…とか。 複数のリクエストヘッダの場合はどうなるんでしょうかね? # \r\nで連結…なんでしょうか。
補足
WireSharkでパケットを確認してみたところ、ヘッダがおかしい事は確認できました。 少し調べてみましたがまだ解決には至ってません。 調べた分を以下に記載させてもらいます。 >flag = HttpSendRequest( hRequest, header, wcslen( header ), param, wcslen( param )); この時のヘッダは以下でした。 >POST /sample/service.php HTTP/1.1 >Content-Type: application/x-www-form-urlencoded >Host: 192.168.11.25:9999 >Content-Length: 6 >Cache-Control: no-cache > >typ HttpSendRequestの第5引数をsizeofにするとヘッダーはちゃんとしたように見えました。 >flag = HttpSendRequest( hRequest, header, wcslen( header ), param, sizeof( param )); この時は以下でした。 >POST /sample/service.php HTTP/1.1 >Content-Type: application/x-www-form-urlencoded >Host: 192.168.11.25:9999 >Content-Length: 14 >Cache-Control: no-cache > >type=1 FORMからPOSTする分はちゃんと受け取るのでphpの方は正しいと思っています。 phpの受信コードは以下です。 >$_type = $_POST['type']; 何かありましたらまた返信を頂けると助かります
お礼
返信ありがとうございます。 おかげで解決することができました。 最終的に以下の変更でパラメータを渡すことができました。 >char param[] = "type=1"; >wchar_t header[] = L"Content-Type: application/x-www-form-urlencoded"; // char型だと12150エラー発生 >flag = HttpSendRequest( hRequest, header, wcslen( header ), param, strlen( param )); ヘッダーは以下のようになっていました。 >POST /sample/service.php HTTP/1.1 >Content-Type: application/x-www-form-urlencoded >Host: 192.168.11.25:9999 >Content-Length: 6 >Cache-Control: no-cache > >type=1 ありがとうございました。