IdHTTPServer接收可读参数

时间:2013-12-20 15:13:24

标签: php delphi indy

我在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服务器。

1 个答案:

答案 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.UnparsedParamsARequestInfo.QueryParams属性包含您必须手动解析和解码的原始未解析数据。

<强>更新 更好的选择是使用POST请求使用application/x-www-form-urlencoded内容类型发送您的数据。这允许为编码数据指定字符集。然后,TIdHTTPServer会将数据解码为TIdHTTPRequestInfo.FormParams属性。查看curl的CURLOPT_POSTCURLOPT_POSTFIELDS选项以发送application/x-www-form-urlencoded格式化的请求。