使用 ServiceStack 的 ServiceClient
Using ServiceStack's ServiceClient
我在另一个线程中被推荐我应该在使用时使用 ServiceClient
一个 ServiceStack API。
我想创建一个模板函数,可以 post 像这样的任何类型的对象:
public Post2<T>(object: T, url: string, httpOptions)
{
try
{
var client = new JsonServiceClient(`${environment.apiEndpoint}` + url)
client.headers = httpOptions;
client.post<T>(object);
}
catch(e)
{
}
}
问题是它告诉我“T 类型的参数不能分配给 IReturn 类型的参数。
typescript-ref http://techstacks.io 生成了以下 DTO(为此目的)
// @Route("/Equipments", "POST")
export class CreateEquipment
{
public name: string;
}
// @Route("/Equipments/{Name}", "GET")
export class GetEquipment implements IReturn<Equipment>
{
public name: string;
public createResponse() { return new Equipment(); }
public getTypeName() { return 'GetEquipment'; }
}
// @Route("/Equipments", "GET")
export class GetEquipments implements IReturn<Equipment[]>
{
public createResponse() { return new Array<Equipment>(); }
public getTypeName() { return 'GetEquipments'; }
}
// @Route("/Equipments/{Name}", "DELETE")
export class DeleteEquipment
{
public name: string;
}
我尝试使用以下代码创建 Post 请求。
var request = new CreateEquipment();
request.name = equipment.name;
var client = new JsonServiceClient(environment.apiEndpoint);
var response = await client.post(request);
这在 VS17 中给出了一个错误; 'CreateEquipment' 类型的参数不可分配给 'IReturn<{}>' 类型的参数。属性 类型 'CreateEquipment'
中缺少 createResponse
我认为这意味着我的 ServiceModel 中缺少某些东西
ServiceStack 的 TypeScript Service Client 应该只用 BaseUrl 构造你的 ServiceStack 主机所在的位置,或者如果你没有指定参数它将使用 /
默认:
var client = new JsonServiceClient(environment.apiEndpoint);
您还需要将它与您的 ServiceStack 服务中的 TypeScript generated DTOs 一起使用,您可以通过安装 @servicestack\cli
npm util:
$ npm install -g @servicestack/cli
然后使用它从 BaseUrl 生成您的服务器 DTO(应该与 environment.apiEndpoint 相同):
$ typescript-ref http://example.org
然后您可以使用它发送填充的请求 DTO:
var request = new MyRequest();
var response = await client.post(request);
请注意,您的 ServiceStack 服务应使用 IReturn<T>
(或 IReturnVoid)接口标记进行注释,以指定服务响应 DTO。
您也可以 make API Requests using URLs,但您需要指定 Response DTO 输入 returns,例如:
client.get<GetTechnologyResponse>("/technology", { Slug: "ServiceStack" })
我在另一个线程中被推荐我应该在使用时使用 ServiceClient 一个 ServiceStack API。
我想创建一个模板函数,可以 post 像这样的任何类型的对象:
public Post2<T>(object: T, url: string, httpOptions)
{
try
{
var client = new JsonServiceClient(`${environment.apiEndpoint}` + url)
client.headers = httpOptions;
client.post<T>(object);
}
catch(e)
{
}
}
问题是它告诉我“T 类型的参数不能分配给 IReturn 类型的参数。
typescript-ref http://techstacks.io 生成了以下 DTO(为此目的)
// @Route("/Equipments", "POST")
export class CreateEquipment
{
public name: string;
}
// @Route("/Equipments/{Name}", "GET")
export class GetEquipment implements IReturn<Equipment>
{
public name: string;
public createResponse() { return new Equipment(); }
public getTypeName() { return 'GetEquipment'; }
}
// @Route("/Equipments", "GET")
export class GetEquipments implements IReturn<Equipment[]>
{
public createResponse() { return new Array<Equipment>(); }
public getTypeName() { return 'GetEquipments'; }
}
// @Route("/Equipments/{Name}", "DELETE")
export class DeleteEquipment
{
public name: string;
}
我尝试使用以下代码创建 Post 请求。
var request = new CreateEquipment();
request.name = equipment.name;
var client = new JsonServiceClient(environment.apiEndpoint);
var response = await client.post(request);
这在 VS17 中给出了一个错误; 'CreateEquipment' 类型的参数不可分配给 'IReturn<{}>' 类型的参数。属性 类型 'CreateEquipment'
中缺少 createResponse我认为这意味着我的 ServiceModel 中缺少某些东西
ServiceStack 的 TypeScript Service Client 应该只用 BaseUrl 构造你的 ServiceStack 主机所在的位置,或者如果你没有指定参数它将使用 /
默认:
var client = new JsonServiceClient(environment.apiEndpoint);
您还需要将它与您的 ServiceStack 服务中的 TypeScript generated DTOs 一起使用,您可以通过安装 @servicestack\cli
npm util:
$ npm install -g @servicestack/cli
然后使用它从 BaseUrl 生成您的服务器 DTO(应该与 environment.apiEndpoint 相同):
$ typescript-ref http://example.org
然后您可以使用它发送填充的请求 DTO:
var request = new MyRequest();
var response = await client.post(request);
请注意,您的 ServiceStack 服务应使用 IReturn<T>
(或 IReturnVoid)接口标记进行注释,以指定服务响应 DTO。
您也可以 make API Requests using URLs,但您需要指定 Response DTO 输入 returns,例如:
client.get<GetTechnologyResponse>("/technology", { Slug: "ServiceStack" })