使用ServiceStack的ServiceClient

时间:2019-03-16 22:00:30

标签: servicestack serviceclient

我在另一个线程中被推荐使用时应使用ServiceClient ServiceStack API。

我想创建一个模板函数,可以发布任何类型的对象,如下所示:

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中缺少了一些东西

1 个答案:

答案 0 :(得分:1)

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,但是您需要指定响应DTO 类型,例如,返回

client.get<GetTechnologyResponse>("/technology", { Slug: "ServiceStack" })