我在TIdHttpServer上的POST请求包含奇怪的字符,json字符串

时间:2017-12-21 10:47:45

标签: json rest delphi post delphi-10.1-berlin

我收到POST请求时收到的JSON字符串有问题。目前这是我阅读它的方式:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button type="button" id="sendRequest1" ><span>Avialable Now</span></button>
<button type="button" id="sendRequest2" ><span>Avialable Now</span></button>

我单独尝试procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); var Stream : TStream; S : string; begin If ARequestInfo.Command = 'POST' then begin Stream := ARequestInfo.PostStream; if assigned(Stream) then begin Stream.Position := 0; S := UTF8ToAnsi(ReadStringFromStream(Stream)); end; end; end; ReadStringFromStream()UTF8ToAnsi(),但我一直看到这样的字符串:

  

&#39; [&#39;#$ A#9&#39; {&#39;#$ A#9#9&#39;&#34;测试&#34;:&#34; BB&# 34;,&#39;#$ A#9#9&#39;&#34;测试&#34;:&#34; AA&#34;&#39;#$ A#9&#39;}&#39 ;#$ A&#39;]&#39;

我知道它与编码有关,但我不知道如何修复它。

2 个答案:

答案 0 :(得分:4)

你知道哈希(#)符号表示一个字符值,并且美元($)符号表示十六进制值,是吗?因此#$A表示字符十进制10,恰好表示NewLine,而#9表示字符9,即TAB字符。返回字符串中没有任何意外。如果您将其提供给理解NewLine而没有前面的CarriageReturn的内容,它可能会按预期显示。

exmple的调试器使用#-syntax表示无法以视觉方式表示的字符。

答案 1 :(得分:2)

您在示例中显示的数据完全正常,正如Tom B所解释的那样。您正在查看调试器中的字符串数据,其中#A是换行符,#9是制表符字符,所以实际字符串如下所示:

[
    {
        "test":"bb",
        "test":"aa"
    }
]

哪个是有效的JSON。

但是,您阅读数据的方式并不正确,尤其是如果您使用的是Unicode版本的Delphi(2009+)。您没有将任何值传递给AByteEncoding的{​​{1}}参数,因此它将使用Indy的默认编码对流字节进行解码,默认情况下为7位US-ASCII(请参阅{{ 1}} ReadStringFromString()单位中的变量。 JSON默认使用UTF-8,因此如果JSON包含任何非ASCII字符,则会损坏JSON。在事实不能解决之后使用GIdDefaultTextEncoding

您的代码应该是这样的:

IdGlobal

告诉Indy将流字节解码为UTF-8到UTF-16,然后返回解码后的字符串(如果您使用的是非Unicode版本的Delphi,UTF-16数据将在退出时转换为ANSI ,取决于UTF8ToAnsi()的可选procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); var Stream : TStream; S : string; begin If ARequestInfo.CommandType = hcPOST then begin Stream := ARequestInfo.PostStream; if Assigned(Stream) then begin S := ReadStringFromStream(Stream, -1, IndyTextEncoding_UTF8); end end end; 参数。

相关问题