zoukankan      html  css  js  c++  java
  • delphi创建HTTPServer服务接收json中文乱码

    做服务端,很多人已经淘汰用delphi了,确实,各种中文乱码的问题,也有人劝过我用JavaScript,很简单,连源码都给我了,但是还没时间研究,眼前有个项目,必须提供一个服务供第三方调用,请求方式POST,请求格式JSON,当解析请求的json时发现中文乱码。解决方法如下:

    上代码:

    procedure TZZJForm.VodHttpServerCommandGet(AContext: TIdContext;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
    var
      tempstr,ips:string;
      ss,ss1:TStringStream;
    begin
      CoInitialize(NIL);
      BaseJo := so;
      sjo := SO('{}');
      I :=0; J:=0; K:=0;
      ss := TStringStream.Create;
      AResponseInfo.ContentType := 'json;charset=utf-8'; //这句话对POST请求json格式无效,但对于GET请求比较有用
      ips:=TIdIOHandlerSocket(AContext.Connection.IOHandler).Binding.PeerIP;//获取请求地址
      tempstr:=ARequestInfo.Document; //获取请求字符串  GET请求,一般浏览器会请求两次,第一次是实际请求内容,第二次是 favicon.ico,服务器应判断请求的字符串,不然取不到实际值 POST没有
      if tempstr='favicon.ico' then
      begin
        AResponseInfo.ContentText :='{}'; //返回值
        Exit;
      end;
      if not SameText(ARequestInfo.Command, 'post') then
      begin
        with SJO do
        begin
          I['code'] := -1;
          S['message'] := '请使用POST请求';
        end;
        AResponseInfo.ContentText := SJO.AsJSon(True);
        Exit;
      end;
      if tempstr<>'/pmc/seltSucCallback' then
      begin
        with SJO do
        begin
          I['code'] := -5;
          S['message'] := '无效的请求地址';
        end;
        AResponseInfo.ContentText := SJO.AsJSon(True);
        Exit;
      end;
      if tempstr='/pmc/seltSucCallback' then
      begin
        ss := TStringStream(ARequestInfo.PostStream);
        ss.SaveToFile('A.TXT'); //此文件里的中文正常(第一种方法:用文件转换)
      //第二种方法用另一个tStringstream转换一下
       ss1:= TStringStream.Create('',TEncoding.UTF8);
      ss1.LoadFromStream(ss);
     memo1.lines,add(ss1.DataString);   //这里没有乱码   
        //Memo1.Lines.LoadFromStream( ss );//中文乱码
    
        //memo1.lines.add( StreamToString(ARequestInfo.PostStream));//转换成string中文也会乱码
    //  .....解析入参...
     end;
    end; 

    虽然方法笨拙,但能解决燃眉之急,有大神知道其它方法的欢迎指点。

    顺便把创建服务的代码贴上:

    //创建服务
      try
        VodHttpServer.Bindings.Clear; //VodHttpServer:TIdHTTPServer
        Binding := VodHttpServer.Bindings.Add;
        Binding.Port:=5050;
        binding.IP:= SIP;// //
        VodHttpServer.Active:=true;
      except
        on e:Exception do
        begin
           ShowMessage('加载服务设置error '+e.message);
        end;
      end;
    

      

  • 相关阅读:
    vs2008 服务器控件库
    dropdoenlist 设置默认值
    .NET用HttpFileCollection实现多文件上传
    dropdownlist 绑定
    简单的webservice调用(天气预报)
    统计在线人数
    多文件上传
    dropdownlist1 绑定 value值
    WMI 脚本入门:第一部分 (MSDN)
    WMI 脚本入门:第三部分 (MSDN)
  • 原文地址:https://www.cnblogs.com/studypanp/p/14290928.html
Copyright © 2011-2022 走看看