
winnetを使ってPOST形式でサーバにパラメータを渡そうとしていますが、パラメータが渡せずに困っています。
HttpOpenRequestかHttpSendRequestがおかしいと思うのですが、自分では見当がつきません。
よければ何処に問題があるのか教えてください。
環境:vc++2005
int DoHttpRequest( void )
{
HINTERNET hInet, hSession, hRequest;
DWORD dwTotal = 0;
wchar_t param[] = L"type=1";
wchar_t header[] = L"Content-Type: application/x-www-form-urlencoded";
wchar_t accept[] = L"Accept: */*"; // 使ってない
BOOL flag;
Console::WriteLine( "Http接続START" );
//インターネット(WinInet)初期化
hInet = InternetOpen( NULL,
INTERNET_OPEN_TYPE_PRECONFIG,
NULL, NULL, 0);
if (hInet == NULL) {
Console::WriteLine( "エラー1" );
return -1;
}
// サーバへ接続
hSession = InternetConnect( hInet, L"192.168.11.25", 9999,
NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0 );
if( hSession == NULL ) {
Console::WriteLine( "エラー2" );
InternetCloseHandle(hInet);
return -1;
}
//HTTPセッションの開始, 指定のURLオープン
hRequest = HttpOpenRequest( hSession, L"POST", L"/sample/service.php",
NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0 );
if (hRequest == NULL) {
Console::WriteLine( "エラー3" );
InternetCloseHandle(hSession);
InternetCloseHandle(hInet);
return -1;
}
// 送信
flag = HttpSendRequest( hRequest, header, wcslen( header ), param, wcslen( param ));
if( flag == FALSE ) {
Console::WriteLine( "エラー4" );
InternetCloseHandle(hRequest);
InternetCloseHandle(hSession);
InternetCloseHandle(hInet);
return -1;
}
//インターネットハンドルの解放
InternetCloseHandle( hRequest );
InternetCloseHandle( hSession );
InternetCloseHandle( hInet );
Console::WriteLine( "Http接続END" );
return 0;
}
No.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()でよいのではないでしょうか?
返信ありがとうございます。
おかげで解決することができました。
最終的に以下の変更でパラメータを渡すことができました。
>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
ありがとうございました。
No.1
- 回答日時:
とりあえず、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'];
何かありましたらまた返信を頂けると助かります
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
トランザクションが原因?DBに...
-
Localeクラスについて
-
ワードプレスサイト PHP8.0.25...
-
PHPでネットワークドライブのop...
-
これは例外処理でしょうか?
-
ワードプレスでエラーが出て、...
-
メール送信エラー処理について
-
phpのテキストファイルの書き込み
-
xamppのAPCで終了エラーが発生...
-
wininetでPOSTで値を渡せません
-
require_once で読み込まれたか?
-
PHP8を使うと、大量のWarningが...
-
IIS/PHPのサイトでたまにCGIエ...
-
@$a = $b["c"] or $a = "text";...
-
phpエラーメッセージをコメント...
-
phpのrenameでエラーが出ます
-
fsockopenの例外について
-
「@$変数」の「@の意味は?」
-
openssl_pkcs7_encryptについて
-
Subversionのリポジトリの削除
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フォントの色を変えるには?
-
トランザクションが原因?DBに...
-
PHPでfatal errorが出ても無視...
-
iframeからのアクセスか、ブラ...
-
PHP8を使うと、大量のWarningが...
-
パースエラーとは?
-
PHPで、エラーがない場合のみ画...
-
error_reporting(0);にも関わら...
-
PHPにて外部サイト内容が取得不...
-
「@$変数」の「@の意味は?」
-
PHPでネットワークドライブのop...
-
PHPで特定のURLにジャンプす...
-
phpのrenameでエラーが出ます
-
ある条件に当てはまったときに...
-
「file_get_contents」で「HTTP...
-
PostgreSQLへのinsert処理
-
正規表現での最後尾のバックス...
-
require_once で読み込まれたか?
-
awsにApacheとPHPを入れて、何...
-
IIS/PHPのサイトでたまにCGIエ...
おすすめ情報