天天看点

vcl fmx访问restful asp.net core服务器(客户端+服务端)

//delphi 调用代码  只演示了简单查询的代码,分页查询代码类似

procedure Tform1.button1Click(Sender: TObject);

var

  jo:ISuperObject;

 json,_message:string;

 _result:string;

 _msg,_res:string;

   reqData, resData:Tstringstream;

vHttp: Tnethttpclient;

ja:iSuperArray;

begin

    jo:=SO();

    jo.S['keystore']:='xxx';

    jo.S['method']:='simplequery';

    jo.S['sql']:='select * from employee where id=2';

  try

    vHttp := Tnethttpclient.Create(nil);

    reqData := TStringStream.Create(jo.AsJSON);

    resData := TStringStream.Create('',TEncoding.GetEncoding(65001));

    try

     with vHttp do

       begin

        ConnectionTimeout := 20000;

        ResponseTimeout := 100000;

        AcceptCharSet := 'utf-8';

        AcceptEncoding := '65001';

        AcceptLanguage := 'zh-CN';

        ContentType := 'application/json';

        UserAgent := 'Embarcadero URI Client/1.0';

       end;

      vHttp.Post('http://localhost:59223/api/remote', reqData, resData);

      json :=resData.DataString.Trim;

       jo:=SO(json);

       ja:=jo.A['data'];

       XtoCds(ja,clientdataset1);//转换为clientdataset

    except

     on e:exception do

     begin

      jo:=SO();

      jo.S['result']:='-1';

      jo.S['message']:=e.Message.Trim;

      json:=jo.AsJSON();

     end;

    end;

  finally

    reqData.Free;

    resData.Free;

    FreeAndNil(vHttp);

  end;

end;

//asp.net core 服务器webapi控制器,asp.net可以配置在 win  linux mac上面

//在windows上面可以架设在IIS上 其他平台请自行查找

//可以nginx来提高并发量,可以满足大型或小型的服务需求

 public class RemoteController : Controller

    {

        private readonly Chloe.IDbContext _dbContext;

        private IHostingEnvironment _environment;

        private IConfiguration _configuration;

        public RemoteController(Chloe.IDbContext dbContext, IHostingEnvironment environment, IConfiguration Configuration)

        {

            _dbContext = dbContext;

            _environment = environment;

            _configuration = Configuration;

        }

        // POST api/<controller>

        [HttpPost]

        public string Post([FromBody] JObject _value)

        {

            StringBuilder builder = new StringBuilder();

            JObject jo = _value;

            string keystore = jo.Value<string>("keystore");

            string method = jo.Value<string>("method").Trim();

            string _result = "";

            if (keystore == null)

            {

                builder.Append("{");

                builder.Append("\"result\":\"1\",");

                builder.Append("\"message\":\"验证失败\"");

                builder.Append("}");

                return builder.ToString();

            }

           if (keystore != _configuration.GetSection("KeysString")["webapiKeyStore"])  //传入的keystore和configuration中的是否一致

            {

                builder.Append("{");

                builder.Append("\"result\":\"1\",");

                builder.Append("\"message\":\"验证失败\"");

                builder.Append("}");

                return builder.ToString();

            }

            if (jo == null)

            {

                builder.Append("{");

                builder.Append("\"result\":\"1\",");

                builder.Append("\"message\":\"传入参数错误\"");

                builder.Append("}");

                return builder.ToString();

            }

            switch (method)

            {

                case "0":  //判断网络是否畅通

                    builder.Append("{");

                    builder.Append("\"result\":\"9\",");

                    builder.Append("\"message\":\"网络畅通\"");

                    builder.Append("}");

                    _result = builder.ToString();

                    break;

                case "simplequery"://简单sql查询

                    _result = _simplequery(jo);

                    break;

                case "execsql"://执行sql语句

                    _result = _execsql(jo);

                    break;

                case "pagequery"://分页查询

                    _result = _pagequery(jo);

                    break;

                case "openproc"://存储过程查询

                    _result = _openproc(jo);

                    break;

                case "execproc"://存储过程执行

                    _result = _execproc(jo);

                    break;

                default:

                    builder.Append("{");

                    builder.Append("\"result\":\"1\",");

                    builder.Append("\"message\":\"操作错误\"");

                    builder.Append("}");

                    _result = builder.ToString();

                    break;

            }

            return _result;

        }

        private string _simplequery(JObject _jo)//简单sql查询

        {

            StringBuilder builder = new StringBuilder();

            try

            {

                string _sql = _jo.Value<string>("sql");  //获取sql语句

                //var result = _dbContext.SqlQuery<dynamic>(_sql).ToList().Skip((1 - 1) * 10).Take(10);  //分页查询

                var result = _dbContext.SqlQuery<dynamic>(_sql).ToList();  

                if (result == null)

                {

                    builder.Append("{");

                    builder.Append("\"result\":\"1\",");

                    builder.Append("\"message\":\"执行sql语句错误\"");

                    builder.Append("}");

                    return builder.ToString();

                }

                int _count = result.Count();

                string _json = JsonConvert.SerializeObject(result);

                builder.Append("{");

                builder.Append("\"result\":\"0\",");

                builder.Append("\"message\":\"\",");

                builder.Append("\"count\":" + _count + ",");

                builder.Append("\"data\":");

                builder.Append(_json);

                builder.Append("}");

                return builder.ToString();

            }

            catch (Exception e)

            {

                builder.Append("{");

                builder.Append("\"result\":\"1\",");

                builder.Append(string.Format("\"message\":\"{0}\"", e.Message));

                builder.Append("}");

                return builder.ToString();

            }

        }

        private string _execsql(JObject _jo)//执行sql语句

        {

            StringBuilder builder = new StringBuilder();

            try

            {

                string _sql = _jo.Value<string>("sql");  //获取sql语句

                int _count = _dbContext.Session.ExecuteNonQuery(_sql);

                if (_count == 0)

                {

                    builder.Append("{");

                    builder.Append("\"result\":\"1\",");

                    builder.Append("\"message\":\"执行sql语句错误\"");

                    builder.Append("}");

                    return builder.ToString();

                }

                else

                {

                    builder.Append("{");

                    builder.Append("\"result\":\"0\",");

                    builder.Append("\"message\":\"执行成功\"");

                    builder.Append("}");

                    return builder.ToString();

                }

            }

            catch (Exception e)

            {

                builder.Append("{");

                builder.Append("\"result\":\"1\",");

                builder.Append(string.Format("\"message\":\"{0}\"",e.Message));

                builder.Append("}");

                return builder.ToString();

            }

        }