小弟最近在写一用Indy写的webservice中间层代码发现了Reponse的内空中如果有中文,客户端显示是乱码
原来的代码片断如下:
procedure THisWebBase.DealEaiServerAction(Sender: TObject; Request: TWebRequest;
Response: TWebResponse; var Handled: Boolean);
var
LXmlIn, LXmlOut: string;
LEaiServer: THisEaiHttpServer;
begin
if (Request.Method = 'POST') or (Request.Method = 'PUT')then
begin
LXmlIn := '';
Request.ContentEncoding;
LXmlIn := Request.Content;
LXmlIn := HTTPDecode(LXmlIn);
CoInitialize(nil);
LEaiServer := THisEaiHttpServer.Create(Request.RemoteAddr);
if FLocalPort = 0 then
FLocalPort := Request.ServerPort;
try
FServerValid := True;
try
LXmlOut := LEaiServer.GetData(LXmlIn);
except on E: Exception do
begin
HisMzFuncs.WriteLog(e.Message);
HpFuncs.WriteEventLog(Event_Level_Error, Event_Type_Apply, e.Message, Request.RemoteAddr);
end;
end;
finally
LEaiServer.Free;
CoUninitialize();
end;
Response.ContentEncoding := 'GB2312';
Response.Content := LXmlOut;
end else
begin
Response.ContentEncoding := 'GB2312';
Response.Content := UTF8Encode('<center>Zs XmlServer:只接受post方法</center>');
end;
Handled := True;
end;
经过调试发现问题出在Indy10的IdHTTPWebBrokerBridge.pas代码的如下片断
procedure TIdHTTPAppResponse.SetContent(const AValue: AnsiString);
var
LValue : string;
LEncoding: TIdTextEncoding;
LBytes: TIdBytes;
begin
LValue := string(AValue);
FResponseInfo.ContentText := LValue;
FResponseInfo.ContentLength := Length(LValue);
end;
此处的FResponseInfo.charset没有重新赋值,改成如下代码即可
procedure TIdHTTPAppResponse.SetContent(const AValue: AnsiString);
var
LValue : string;
LEncoding: TIdTextEncoding;
LBytes: TIdBytes;
begin
LValue := string(AValue);
//此处为新增加的代码
FResponseInfo.CharSet := Self.ContentEncoding;
FResponseInfo.ContentText := LValue;
FResponseInfo.ContentLength := Length(LValue);
end;