客户端如何连接 DataSnap Server 调用服务的方法
一般http访问的地址是
http://localhost:8099/datasnap/rest/TServerMethods1/EchoString/abc
一、用FDConnection1连接Datasnap服务器
FireDAC 连接Datasnap服务端。这个是tcp协议连接通讯,长连接。服务端不是没个方法都建立实例释放实例,而是连接的时候建立,中间调用多少个方法都不释放实例,连接断开才释放。
不是。net的web api或者Datasnap 的 webmodule,纯粹是tcp。
DriverID=DS
Protocol=tcp/ip
Server=127.0.0.1
Port=
User_Name=dsusr
Password=
http://docwiki.embarcadero.com/RADStudio/Berlin/en/Connect_to_DataSnap_Server_(FireDAC)
fdstoreproc 执行返回数据
FDStoredProc1.Close;
FDStoredProc1.Unprepare;
FDStoredProc1.StoredProcName := 'TServerMethods1.QueryData';
FDStoredProc1.Prepare;
FDStoredProc1.ParamByName('sql').Value := 'select * from MyTable';
FDStoredProc1.open;
FDMemTable1.Close;
FDMemTable1.Data := FDStoredProc1.Data;
如果是字符串参数及返回字符串参数
FDStoredProc1.Params.Items[0].Value := 'hello'; //入参
Self.Caption := FDStoredProc1.Params.Items[1].Value; //返回参数
也可以通过ParamByName对Datasnap server的方法传参,是不是很方便?
FDStoredProc1.Params.ParamByName('value').Value:= 'hello';
FDStoredProc1.Params.ParamByName('retvlue').Value;
self.Caption:= FDStoredProc1.Params.Items[0].Name;
self.Caption:= FDStoredProc1.Params.Items[1].Name;
procedure TDepartmentsClientForm.Button3Click(Sender: TObject);
begin
FDStoredProc1.Close;
FDStoredProc1.Unprepare;
FDStoredProc1.StoredProcName := 'TServerMethods1.ReverseString';
FDStoredProc1.Prepare;
FDStoredProc1.Params.Items[].Value := 'hello';
FDStoredProc1.Params.Count;
FDStoredProc1.ExecProc;
Self.Caption := FDStoredProc1.Params.Items[].Value; end; procedure TDepartmentsClientForm.Button4Click(Sender: TObject);
begin FDStoredProc1.Close;
FDStoredProc1.Unprepare;
FDStoredProc1.StoredProcName := 'TServerMethods1.EchoString';
FDStoredProc1.Prepare;
FDStoredProc1.Params.Items[].Value := 'hello';
FDStoredProc1.Params.Count;
FDStoredProc1.ExecProc;
Self.Caption := FDStoredProc1.Params.Items[].Value; end;
二、TSQLConnection,(该控件其实也支持android平台)
参考官方的例子
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Connecting_the_Client_to_DataSnap_Server
也支持http。
D:\Users\Public\Documents\Embarcadero\Studio\14.0\Samples\CPP\DataSnap\SimpleDataSnapDemo\CppDataSnapClient\CppDataSnapClientApp.cbproj
这个也是tcp通讯,原理同上。
SQLConnection控件,Params,
DriverName=DataSnap
HostName=localhost
port=211
void __fastcall TForm2::CheckBox1Change(TObject *Sender)
{
SQLConnection1->Connected = CheckBox1->IsChecked;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
TServerMethods1Client *Temp;
Temp = new TServerMethods1Client(SQLConnection1->DBXConnection);
try {
Label1->Text = Temp->EchoString(Edit1->Text);
}
__finally {
delete Temp;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button2Click(TObject *Sender)
{
TServerMethods1Client *Temp;
Temp = new TServerMethods1Client(SQLConnection1->DBXConnection);
try {
Label1->Text = Temp->ReverseString(Edit1->Text);
}
__finally {
delete Temp;
}
}
DataSnapClientClasses.h
#ifndef DataSnapClientClassesH
#define DataSnapClientClassesH #include "DBXCommon.hpp"
#include "Classes.hpp"
#include "SysUtils.hpp"
#include "DB.hpp"
#include "SqlExpr.hpp"
#include "DBXDBReaders.hpp"
#include "DBXCDSReaders.hpp" class TServerMethods1Client : public TObject
{
private:
TDBXConnection *FDBXConnection;
bool FInstanceOwner;
TDBXCommand *FEchoStringCommand;
TDBXCommand *FReverseStringCommand;
public:
__fastcall TServerMethods1Client(TDBXConnection *ADBXConnection);
__fastcall TServerMethods1Client(TDBXConnection *ADBXConnection, bool AInstanceOwner);
__fastcall ~TServerMethods1Client();
System::UnicodeString __fastcall EchoString(System::UnicodeString value);
System::UnicodeString __fastcall ReverseString(System::UnicodeString value);
}; #endif //--------------------------------------------------------------------------- // This software is Copyright (c) 2014 Embarcadero Technologies, Inc.
// You may only use this software if you are an authorized licensee
// of an Embarcadero developer tools product.
// This software is considered a Redistributable as defined under
// the software license agreement that comes with the Embarcadero Products
// and is subject to that software license agreement. //---------------------------------------------------------------------------
//
// Created by the DataSnap proxy generator.
// 1/31/2013 2:39:56 PM
// #include "DataSnapClientClasses.h" System::UnicodeString __fastcall TServerMethods1Client::EchoString(System::UnicodeString value)
{
if (FEchoStringCommand == NULL)
{
FEchoStringCommand = FDBXConnection->CreateCommand();
FEchoStringCommand->CommandType = TDBXCommandTypes_DSServerMethod;
FEchoStringCommand->Text = "TServerMethods1.EchoString";
FEchoStringCommand->Prepare();
}
FEchoStringCommand->Parameters->Parameter[]->Value->SetWideString(value);
FEchoStringCommand->ExecuteUpdate();
System::UnicodeString result = FEchoStringCommand->Parameters->Parameter[]->Value->GetWideString();
return result;
} System::UnicodeString __fastcall TServerMethods1Client::ReverseString(System::UnicodeString value)
{
if (FReverseStringCommand == NULL)
{
FReverseStringCommand = FDBXConnection->CreateCommand();
FReverseStringCommand->CommandType = TDBXCommandTypes_DSServerMethod;
FReverseStringCommand->Text = "TServerMethods1.ReverseString";
FReverseStringCommand->Prepare();
}
FReverseStringCommand->Parameters->Parameter[]->Value->SetWideString(value);
FReverseStringCommand->ExecuteUpdate();
System::UnicodeString result = FReverseStringCommand->Parameters->Parameter[]->Value->GetWideString();
return result;
} __fastcall TServerMethods1Client::TServerMethods1Client(TDBXConnection *ADBXConnection)
{
if (ADBXConnection == NULL)
throw EInvalidOperation("Connection cannot be nil. Make sure the connection has been opened.");
FDBXConnection = ADBXConnection;
FInstanceOwner = True;
} __fastcall TServerMethods1Client::TServerMethods1Client(TDBXConnection *ADBXConnection, bool AInstanceOwner)
{
if (ADBXConnection == NULL)
throw EInvalidOperation("Connection cannot be nil. Make sure the connection has been opened.");
FDBXConnection = ADBXConnection;
FInstanceOwner = AInstanceOwner;
} __fastcall TServerMethods1Client::~TServerMethods1Client()
{
delete FEchoStringCommand;
delete FReverseStringCommand;
}
三、DSRestConnection
这个是http调用,rest风格,每一次方法的调用都是一次实例化,方法,释放的3个过程。
就是 web api/rest风格,调用方法类似SQLConnection,生个各个方法的定义。
只支持http和https两种通讯协议。调用datasnap Rest服务。
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Connecting_the_Client_to_DataSnap_Server
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Tutorial:_Using_a_REST_DataSnap_Server_with_an_Application
self.DSRestConnection1.Host:='127.0.0.1';
self.DSRestConnection1.Port:= ;
self.DSRestConnection1.Protocol:=''//http https TServerMethods1Client这个生成很多方法
ClientModule2.ServerMethods1Client.GetDepartmentNames();
function TServerMethods1Client.GetDepartmentNames(const ARequestFilter: string): TFDJSONDataSets;
begin
if FGetDepartmentNamesCommand = nil then
begin
FGetDepartmentNamesCommand := FConnection.CreateCommand;
FGetDepartmentNamesCommand.RequestType := 'GET';
FGetDepartmentNamesCommand.Text := 'TServerMethods1.GetDepartmentNames';
FGetDepartmentNamesCommand.Prepare(TServerMethods1_GetDepartmentNames);
end;
FGetDepartmentNamesCommand.Execute(ARequestFilter);
if not FGetDepartmentNamesCommand.Parameters[].Value.IsNull then
begin
FUnMarshal := TDSRestCommand(FGetDepartmentNamesCommand.Parameters[].ConnectionHandler).GetJSONUnMarshaler;
try
Result := TFDJSONDataSets(FUnMarshal.UnMarshal(FGetDepartmentNamesCommand.Parameters[].Value.GetJSONValue(True)));
if FInstanceOwner then
FGetDepartmentNamesCommand.FreeOnExecute(Result);
finally
FreeAndNil(FUnMarshal)
end
end
else
Result := nil;
end;
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Getting_Started_with_Java_Android_DataSnap_Mobile_Connector
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Getting_Started_with_DataSnap_Mobile_Connectors
也就是客户端调用,是通过生成服务方法代理
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Generating_DataSnap_Server_Method_Proxies
Generating DataSnap Server Method Proxies
Go Up to DataSnap Server Application
Proxy DataSnap classes are needed in client applications to invoke server methods. In order to generate server methods, drop a TDSRestConnection in a form and connect to a running DataSnap server in design mode. Right-click the TDSRestConnection component and select Generate DataSnap Client Classes.
The proxy unit is added to the current project and each exposed method
can be used to invoke the corresponding server method. When generating a
Delphi proxy for the server, that proxy should have on it the useful DSAdmin methods. These DSAdmin
methods are any functions or procedures publicly declared and exposed
to the user, as well as any visible methods in the classes that DSAdmin extends.
If the server method signature changes or methods are added or removed, the same option will refresh the proxy unit.
后续参考http://blog.csdn.net/cb168/article/details/14454499 客户端部分
客户端如何连接 DataSnap Server 调用服务的方法的更多相关文章
- ems lite 客户端远程连接mysql server
在本地用ems客户端远程连接虚拟机上的mysql server,弹出客户端没有权限访问mysql server.使用下面方法进行设置:mysql> select host,user,passwo ...
- [android] 代码注册广播接收者&利用广播调用服务的方法
利用广播调用服务里面的方法,间接的方式调用服务内部的方法,与现实中差不多,请媒体曝光 主界面里面 在界面创建的时候开启一下服务普通的startService()方法 发送一条广播出去 获取Intent ...
- 不同网段无法加载ArcGIS Server发布服务解决方法
问题描述: ArcGIS Server 10发布的服务, (1)在相同网段的Desktop9.3和Engine 9.3程序下可以正常显示, (2)在不同网段Desktop9.3和Engine 9.3程 ...
- 绑定方式开始服务&调用服务的方法
1.编写activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi ...
- Android--绑定服务调用服务的方法
Service依照其启动的方式,可分为两种: 1.Started Started的Service.通过在Application里用startService(Intent intent)方法来启动.这样 ...
- Android -- service 利用广播调用服务的方法
1. 实现原理,在Service里面注册一个广播接收者, 想要调用的时候app发送出广播, 后台的service里面的广播接收者接收到广播,并调用service里面的方法. 2. 示例代码 MainA ...
- cxf 动态创建客户端,局域网能正常调用服务端,外网不能访问
- [android] 绑定方式开启服务&调用服务的方法
需求:后台开启一个唱歌服务,这个服务里面有个方法切换歌曲 新建一个SingService继承系统Service 重写onCreate()和onDestory()方法 填一个自定义的方法changeSi ...
- 代码注册广播接收者&利用广播调用服务的方法服务声命周期(混合开启)
1)说明文档: 2)效果演示: 3)代码演示:
随机推荐
- SQLite数据库学习小结——native层实现
1. SQlite概述 SQLite是一款轻量.快速.跨平台的嵌入式数据库,是遵守ACID(注:ACID指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consi ...
- ThinkPHP 一直坚挺着
ThinkPHP 一直坚挺着 从最初的 0.6 到现在的 5.2 ThinkPHP 走过了 12 年. 从 PHP 4 迭代到 PHP 7.3,每一次更新都给开源社区注入了活力. 这次国内开源软件的投 ...
- js搞定网页的简繁转换
对网页进行简繁字体转换的方法一般有两种:一是使用<简繁通>这样的专业软件,另外一种是制作两套版本的网页.显然,这两种方法都较为麻烦,而且专业软件一般不能用于免费的空间.笔者在这里给大家提供 ...
- Microsoft Dynamics CRM 2011 面向Internet部署 (IFD) CRM 登录出现会话超时的解决办法
一.IFD 登录的时候,过了一段时间,会马上出现“您的会话已过期”,怎么解决这个问题呢,可以通过改变这个时间.具体图如二 Link to Dynamics CRM Wiki Home Page 二.S ...
- R(2) sample
sample: 从整体中挑出部分样本数据函数 Usage: sample.int(n, size = n, replace = FALSE, prob = NULL) x:可以是R中任何对象 siz ...
- oracle 无法启动图形界面,no protocol specified
linux 终端启动图形化程序界面时报错:No protocol specified这是因为Xserver默认情况下不允许别的用户的图形程序的图形显示在当前屏幕上. 如果需要别的用户的图形显示在当前屏 ...
- (文章转载)织梦CMS判断不同的栏目显示不同的图片
{dede:php} $thisid = $refObj->Fields['id']; $row = $dsql->GetOne("Select typeid From `ybs ...
- 大数据挖掘算法篇之K-Means实例
一.引言 K-Means算法是聚类算法中,应用最为广泛的一种.本文基于欧几里得距离公式:d = sqrt((x1-x2)^+(y1-y2)^)计算二维向量间的距离,作为聚类划分的依据,输入数据为二维数 ...
- 用pyenv 和 virtualenv 搭建单机多版本python 虚拟开发环境
作为主流开发语言, 用python 开发的程序越来越多. 方便的是大多linux系统里面都默认集成了python, 开发可以随时随地开始. 但有时候这也成为了一个短板, 比如说有时候我们需要开发和调试 ...
- 峰Spring4学习(3)注入参数的几种类型
People.java model类: package com.cy.entity; import java.util.ArrayList; import java.util.HashMap; im ...