一、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 带的
点击send request
八、完成
九、其它说明
1、返回内容里可以包括JSON数组
2、尽量返回JSON对像,据说JAVA里通讯用对像比较多
3、编码还是挺烦人的。可以用https://www.sojson.com/来翻译一下JSON,用UNICODE来解中文
4、如果要求不高的话,可以采用BASE64编码,这个编码个人感觉比较通用,但是占用的字节比较多,但是比较简单