delphi xe10 restserver

一、NEW一个datasnap server 基本默认选择,中间把HTTP打上挑

二、打开ServerContainerUnit1单元

三、DSHTTPService1控件的FormatResult事件中增加代码

procedure TServerContainer1.ds_h_datacountFormatResult(Sender: TObject; var ResultVal: TJSONValue; const Command: TDBXCommand; var Handled: Boolean);
var
  Aux: TJSONValue;
  // str:string;
begin
  // 去除返回值中的[]
  Aux := ResultVal;
  ResultVal := TJSONArray(Aux).Items[0];
  TJSONArray(Aux).Remove(0);
  Aux.Free;
  // 去除返回值中的result
  Handled := True;
  // str:= ResultVal.ToString;

end;

仅仅是格式化一下返回值,不用这个代码也可以

HTTPTrace事件中增加代码

procedure TServerContainer1.ds_h_datacountHTTPTrace(Sender: TObject; AContext: TDSHTTPContext; ARequest: TDSHTTPRequest; AResponse: TDSHTTPResponse);
var
  Buf: TBytes;
  Str: string;
  Stream: TStream;
begin
  Stream := ARequest.PostStream;
  if (Stream <> nil) and (Stream.Size > 0) then
  begin
    // SetLength(Buf, Stream.Size);
    Stream.Position := 0;
    // Stream.Read(Buf, Stream.Size);
//    frm_main.Memo1.Lines.LoadFromStream(Stream,TEncoding.UTF8);
    // Str := TEncoding.UTF8.GetString(Buf);
    // frm_main.Memo1.Lines.Add(Str);

    // AResponse.ResponseNo  := 200;
    // AResponse.ContentType := 'text/html;charset=utf-8';
    // AResponse.ContentText := Str;
  end;
  // TDSHTTPResponseIndy(AResponse).ResponseInfo.ContentEncoding := 'utf-8';
  // TDSHTTPResponseIndy(AResponse).ResponseInfo.ContentType := 'text/html; charset=utf-8';
  TDSHTTPResponseIndy(AResponse).ResponseInfo.CustomHeaders.AddValue('Access-Control-Allow-Origin', '*');
  TDSHTTPResponseIndy(AResponse).ResponseInfo.CustomHeaders.AddValue('Access-Control-Allow-Headers', '*');
  TDSHTTPResponseIndy(AResponse).ResponseInfo.CustomHeaders.AddValue('Access-Control-Allow-Methods', '*');
  TDSHTTPResponseIndy(AResponse).ResponseInfo.CustomHeaders.AddValue('Access-Control-Allow-Credentials', 'true');
  TDSHTTPResponseIndy(AResponse).ResponseInfo.CustomHeaders.AddValue('Access-Control-Max-Age', '3600'); // 保持跨域Ajax时的Cookie
end;

跨域Ajax时使用,没这个需求用不上

四、打开ServerMethodsUnit1单元,里面默认了两个自带的函数,全是GET的。

五、自己写一个接收POST的,

1、增加一个function updatecount_time(Value: string): tjsonobject;//接收POST的方式,前台要加update

2、增加    System.JSON单元的引用

3、增加一个小函数,不同语言POST数据时格式不相同,这个函数可以去掉转义,写的不全,是这个意思就行了

function format_Json_recv(inputStr: string): string;
var
  strtemp: string;
begin
  strtemp := StringReplace(inputStr, '\\', '\', [rfReplaceAll]);
  strtemp := StringReplace(strtemp, '\/', '/', [rfReplaceAll]);
  strtemp := StringReplace(strtemp, '\"', '"', [rfReplaceAll]);
  Result := strtemp
end;

4、接收函数内容

function TServerMethods1.updatecount_time(Value: string): tjsonobject;
var
  //接收用
  temp_json: tjsonobject;
  temp_jv: tjsonvalue;
  shop_name: string;
  Modi_type: string;
  //返回用
  result_json: tjsonobject;
  result_code: string;
  result_msg: string;
begin
  result_code := '';
  //接收JSON
  try
    result_json := tjsonobject.Create;
    temp_json := tjsonobject.Create;
    temp_json := tjsonobject.parsejsonvalue(tencoding.utf8.getbytes(format_Json_recv(Value)), 0) as tjsonobject;
    temp_jv := temp_json.get('shop_name').jsonvalue;
    shop_name := temp_jv.Value;
    temp_jv := temp_json.get('Modi_type').jsonvalue;
    Modi_type := temp_jv.Value;
    result_code := '01';
    result_msg := '解析JSON完成';
  except
    result_code := '02';
    result_msg := '解析JSON错误';
  end;
  //json判断完成
  //生成返回JSON
  result_json.AddPair('result_code', result_code);
  result_json.AddPair('result_msg', result_msg);
  //返回
  try
    result := result_json;
  except

  end;

end;

六、测试GET接收

http://localhost:8080/datasnap/rest/TServerMethods1/ReverseString/abceeee

七、测试POST接收

测试JSON:{"shop_name":"1111","Modi_type":"2222"}

测试地址:http://localhost:8080/datasnap/rest/TServerMethods1/count_time/

用XE10 带的

delphi xe10 restserver_第1张图片delphi xe10 restserver_第2张图片

点击send request

八、完成

九、其它说明

1、返回内容里可以包括JSON数组

2、尽量返回JSON对像,据说JAVA里通讯用对像比较多

3、编码还是挺烦人的。可以用https://www.sojson.com/来翻译一下JSON,用UNICODE来解中文

4、如果要求不高的话,可以采用BASE64编码,这个编码个人感觉比较通用,但是占用的字节比较多,但是比较简单

你可能感兴趣的:(delphi,android,DELPHI,个人小心得,delphi,项目)