使用HTTPSendRequest上传

tho*_*maf 4 delphi proxy ntlm wininet

我必须用delphi将文件发送到php脚本.我最终选择使用Wininet功能,因为我必须通过NTLM身份验证代理.

当我发送文件时,我的内容请求的每个字符之间都有空字符(00):

POST /upload.php HTTP/1.1
User-Agent: MYUSERAGENT
Host: 127.0.0.1
Cookie: ELSSESSID=k6ood2su2fbgrh805vs74fvmk5
Pragma: no-cache
Content-Length: 5

T.E.S
Run Code Online (Sandbox Code Playgroud)

这是我的Delphi代码:

pSession := InternetOpen('MYUSERAGENT', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
pConnection := InternetConnect(pSession, PChar('127.0.0.1'), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
pRequest := HTTPOpenRequest(pConnection, PChar('POST'), PChar('/upload.php'), 'HTTP/1.0', nil, nil, INTERNET_SERVICE_HTTP, 0);
HTTPSendRequest(pRequest, nil, 0, Pchar('TESTR'), Length('TESTR'));
Run Code Online (Sandbox Code Playgroud)

对于发生了什么的任何想法?

Rem*_*eau 7

你没有考虑Delphi字符串从Delphi 2009开始切换到UTF-16编码的Unicode.当你通过时PChar('TESTR'),你实际上是在传递a PWideChar,而不是PAnsiChar你期望的那样.字符串的字符长度为5个字符,但字节长度为10个字节. HTTPSendRequest()按字节操作,而不是字符.所以你真的发送5个字节,其中每个第二个字节是空的,因为这是ASCII字符以UTF-16编码的方式.

改为将最后一行更改为:

var
  S: AnsiString;
...
S := 'TESTR';
HTTPSendRequest(pRequest, nil, 0, PAnsiChar(S), Length(S)); 
Run Code Online (Sandbox Code Playgroud)

您不需要对正在调用的其他函数执行此操作,因为它们确实将Unicode字符作为输入,因此不存在不匹配.