使用 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" })