http
httpでPOST
CInternetSession session;
CHttpConnection *pConn = NULL;
CString strServer, strObj, strHeader;
INTERNET_PORT nPort;
DWORD dwServiceType;
CHttpFile *pFile = NULL;
// ShiftJIS -> UTF-8 変換
CString cstrBody = "{}"; // Body部
CString cstrUtf8Body = SjistoUTF8(cstrBody);
// URLを作成
CString cstrUrl = "http://localhost"
// URL情報を解析
::AfxParseURL(cstrUrl, dwServiceType, strServer, strObj, nPort);
// ポート番号を設定
pConn = session.GetHttpConnection(strServer, nPort);
// ヘッダ部を用意
strHeader.Append(_T("Content-Type: application/json ; charset=\"utf-8\"\n"));
strHeader.AppendFormat(_T("Content-Length: %d\n"), cstrUtf8Body.GetLength());
// 要求
pFile = pConn->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObj);
pFile->SendRequest(strHeader, (LPVOID)((LPCTSTR)cstrUtf8Body), cstrUtf8Body.GetLength());
https
httpsでPOST
CInternetSession session;
CHttpConnection *pConn = NULL;
CString strServer, strObj, strHeader;
INTERNET_PORT nPort;
DWORD dwServiceType;
CHttpFile *pFile = NULL;
// ShiftJIS -> UTF-8 変換
CString cstrBody = "{}"; // Body部
CString cstrUtf8Body = SjistoUTF8(cstrBody);
// URLを作成
CString cstrUrl = "https://localhost"
// URL情報を解析
::AfxParseURL(cstrUrl, dwServiceType, strServer, strObj, nPort);
// ポート番号を設定
pConn = session.GetHttpConnection(strServer, INTERNET_FLAG_SECURE, nPort, NULL, NULL);
// ヘッダ部を用意
strHeader.Append(_T("Content-Type: application/json ; charset=\"utf-8\"\n"));
strHeader.AppendFormat(_T("Content-Length: %d\n"), cstrUtf8Body.GetLength());
// 要求
DWORD httpsFlags = INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_CN_INVALID | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID;
pFile = pConn->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObj, NULL, 1, NULL, _T("HTTP/1.1"), httpsFlags);
// 自己証明書の許可
DWORD dwSecFlags;
pFile->QueryOption(INTERNET_OPTION_SECURITY_FLAGS, dwSecFlags);
dwSecFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
pFile->SetOption(INTERNET_OPTION_SECURITY_FLAGS, dwSecFlags);
pFile->SendRequest(strHeader, (LPVOID)((LPCTSTR)cstrUtf8Body), cstrUtf8Body.GetLength());
ポイントというか違いは getHttpConnection()
と、OpenRequest()
で適切なフラグを渡してあげることです。
自己証明書を利用する場合には、INTERNET_FLAG_IGNORE_CERT_CN_INVALID
とINTERNET_FLAG_IGNORE_CERT_DATE_INVALID
を追加します。
あとは、QueryOption
でSECURITY_FLAGを設定してあげればOKでした。
ちなみに僕はC++全然わかりません。
参考
WinInet APIの利用(その3) HTTPS
WinInet (MFC) の SSL通信 で 開発中に自己署名証明書(オレオレ証明書)を利用する場合のコード