encoding(인가 용어가?)은 NMURL 를 사용하사면 됩니다.
그리고 모두 encoding 이 되야하는것은 아닙니다.
데이터부분만 encoding이 되야 할겁니다.
http:www.aaa.co.kr?name=홍삼원&juso=경기도김포
라면 홍삼원,경기도김포 만 encoding 되어야 할것입니다.
참고로 저는 NMHTTP 로 post하는데 실패했습니다.get은 되는거 같것데..
결국 api로 했습니다...
해보시고 안되면 아래와 같이 해보십시요....
AnsiString __fastcall TForm1::conv(AnsiString s)
{
NMURL1->InputString = s;
return NMURL1->Encode;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINTERNET hOpen, hConnect, hReq;
DWORD dwSize, dwCode;
int i;
AnsiString post_str,szReturned;
static char szData[10240];
hOpen = InternetOpen("WebMessage", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (!hOpen)
{ ShowMessage("InternetOpen");
return;
}
hConnect = InternetConnect(hOpen, "상대방주소(www.yahoo.com)", INTERNET_DEFAULT_HTTP_PORT, "", "", INTERNET_SERVICE_HTTP, 0 , 0);
if (!hConnect)
{ ShowMessage("InternetConnect");
InternetCloseHandle (hOpen);
return;
}
hReq = HttpOpenRequest(hConnect, "POST","받아올페이지(/servlet/xxx.xxx)", HTTP_VERSION, "", NULL, INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE, 0);
if(!hReq)
{ ShowMessage("HttpOpenRequest");
InternetCloseHandle (hConnect);
InternetCloseHandle (hOpen);
return;
}
AnsiString sHeader = "Content-Type: application/x-www-form-urlencoded\nAccept-Language: ko\n";
bool su=HttpAddRequestHeaders(hReq,sHeader.c_str(),sHeader.Length(),HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD);
if(!su)
{ ShowMessage("HttpAddRequestHeaders");
InternetCloseHandle (hConnect);
InternetCloseHandle (hOpen);
return;
}
post_str="";
post_str += "kind="+conv(Edit8->Text.Trim())+"&";
.
.
.
post_str += "name="+conv(Edit7->Text.Trim())+"&";
post_str += "id="+conv(Edit38->Text.Trim());
post_str +="\n";
if (!HttpSendRequest (hReq, NULL, 0, (LPVOID) (LPCSTR) post_str.c_str(), post_str.Length()))
{ ShowMessage("HttpSendRequest");
InternetCloseHandle (hReq);
InternetCloseHandle (hConnect);
InternetCloseHandle (hOpen);
return;
}
dwSize = sizeof (DWORD);
if ( !HttpQueryInfo (hReq, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &dwCode, &dwSize, NULL))
{ ShowMessage("HttpQueryInfo");
InternetCloseHandle (hReq);
InternetCloseHandle (hConnect);
InternetCloseHandle (hOpen);
return;
}
do
{
if (!InternetReadFile (hReq, (LPVOID)szData, sizeof(szData) - 1, &dwSize) )
{ ShowMessage("InternetReadFile");
InternetCloseHandle (hReq);
InternetCloseHandle (hConnect);
InternetCloseHandle (hOpen);
return;
}
if (dwSize > 0)
{
szData [dwSize] = '\0';
szReturned += szData;
}
}
while (dwSize > 0);
InternetCloseHandle (hReq);
InternetCloseHandle (hConnect);
InternetCloseHandle (hOpen);
if (szReturned.AnsiPos("not a valid destination number"))
{ ShowMessage("not a valid destination number");
return;
}
else if (szReturned.AnsiPos("has been sent successfully"))
{ ShowMessage("has been sent successfully");
return;
}
Memo1->Lines->Add(szReturned);
}
wininet.lib 을 포함시켜야 될겁니다.
그거에 대한 내용은 여기서 찾아보시구요..
인터넷 여기저기를 뒤져서
몇개의 소스를 조합했더니만 겨우 해결했던걸로 기억됩니다.
도움이 되서 시간을 절약하셨으면 좋겠습니다.끝.
김대영 님이 쓰신 글 :
: 제목대로 NMHTTP를 가지고 Post로 data를 보내려고 합니다.
: 자꾸 오류가 나서 실제 packet을 따서 봤더니
: data들이 전부 encoding되어 있더군요.
:
: encoding 된것 자체는 문제가 없는데,
: 그 encoding 방식이 서버측에서 decoding하는 방식과 차이가 있더군요.
: ('='나 '.' 등은 encoding 하지 않고 싶은데 자동으로 하고 있습니다)
:
: 이 자동 encoding이 NMHTTP 콤포넌트 레벨에서 하는 것인가요?
: 아니라면 어떻게 하는 것이 좋을까요?
:
: 아시는 분들의 도움을 기다리겠습니다.
: