我在Delpi XE2中创建了一个充当Web服务器的应用程序,我需要传递POST / GET变量来处理它。
要传递参数,我使用此代码(php):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html charset=utf-8" />
</head>
<?php
$url = "http://85.59.95.216:8080?data='тест'";
$timeout = 10;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_close($ch);
?>
然后在delphi中:
procedure TMain.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
Memo1.Lines.Add('Accesing: '+ARequestInfo.Document);
Memo1.Lines.Add('Method: '+ARequestInfo.Command);
Memo1.Lines.Add('Params: '+ARequestInfo.UnparsedParams);
end;
我得到的回应是:
Accesing: /
Method: GET
Params: data='ýýýýýýýý'
如何将其转换为可读的内容?
很抱歉,如果这是一个简单的问题,第一次在delphi中使用Web服务器。
答案 0 :(得分:3)
网址中不允许使用非ASCII字符。您的PHP代码告诉Curl发送UTF-8编码的URL,而不用所需的%hh
表示法编码非ASCII八位字节。 Indy的默认字符集是ASCII(按设计),因此它将丢失它收到的非ASCII八位字节。
在PHP方面,您必须使用curl_escape()
或urlencode()
对网址中的保留/禁止字符进行编码,CURLOPT_URL
将不会为您执行该编码。
然后在Indy端,如果ARequestInfo.Params
属性为True,则可以使用TIdHTTPServer.ParseParams
属性访问已解析和已解码的数据。 ARequestInfo.UnparsedParams
和ARequestInfo.QueryParams
属性包含您必须手动解析和解码的原始未解析数据。
<强>更新强>
更好的选择是使用POST
请求使用application/x-www-form-urlencoded
内容类型发送您的数据。这允许为编码数据指定字符集。然后,TIdHTTPServer
会将数据解码为TIdHTTPRequestInfo.FormParams
属性。查看curl的CURLOPT_POST
和CURLOPT_POSTFIELDS
选项以发送application/x-www-form-urlencoded
格式化的请求。