Использование ServiceCtaent ServiceStack - PullRequest
2 голосов
/ 17 марта 2019

Я получил рекомендацию в другом потоке, что я должен использовать 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.

typcript-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 <{}>». Свойство createResponse отсутствует в типе «CreateEquipment»

То, что я предполагаю, означает, что я что-то упустил в моей ServiceModel

1 Ответ

1 голос
/ 17 марта 2019

ServiceStack Клиент службы TypeScript должен создаваться только с BaseUrl для того места, где находится ваш ServiceStack Host, или если вы не укажете аргумент, он будет использовать / с помощью по умолчанию:

var client = new JsonServiceClient(environment.apiEndpoint);

Вам также необходимо использовать его с сгенерированными TypeScript DTO из службы ServiceStack, которые вы можете сгенерировать, установив утилиту @servicestack\cli npm:

$ npm install -g @servicestack/cli

Затем, используя его для генерации DTO вашего Сервера из BaseUrl (должно совпадать с environment.apiEndpoint):

$ typescript-ref http://example.org

Затем вы можете использовать его для отправки заполненных запросов DTO:

var request = new MyRequest();
var response = await client.post(request);

Обратите внимание, что ваши ServiceStack Services должны быть помечены маркером интерфейса IReturn<T> (или IReturnVoid), указывающим DTO ответа службы.

Вы также можете делать запросы API, используя URL , но вам нужно будет указать Response DTO Тип, который он возвращает, например:

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