5

我正在尝试从这样的 URL 调用 REST 服务:

example.org/account/someusername

我已经定义了请求和响应 DTO。

[Route("/account/{UserName}", "GET")]
public class AccountRequest : IReturn<AccountResponse>
{
    public string UserName { get; set; }
}

public class AccountResponse
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public string Bio { get; set; }
}

调用服务:

JsonServiceClient client = new JsonServiceClient("http://example.org");
AccountRequest request = new AccountRequest { UserName = "me" };

AccountResponse response = client.Get(request); 

但是,当我在客户端上调用 Get 时,它不尊重路由。当我在调试器中检查客户端实例时, AsyncOneWayBaseUri 值为 example.org/json/asynconeway/。这部分无关紧要,因为它并不意味着将请求发送到此 URL。我实际上不知道它在哪里发送请求。我没有收到任何错误,并且我在响应对象中的所有属性都是空的。

我在这里想念什么?

4

4 回答 4

8

使用第 3 方 REST / HTTP API

ServiceStack 的服务客户端固执地调用 ServiceStack Web 服务,因为它们支持 ServiceStack 的预定义路由、内置 Auth、自动路由生成、内置错误处理等。

要调用第 3 方 REST / HTTP APIs,您可以使用 ServiceStack.Text 附带的HTTP Utils ,它为围绕 .NET 的HttpWebRequest的常见数据访问模式提供简洁易读的 API ,例如:

List<GithubRepo> repos = "https://api.github.com/users/{0}/repos".Fmt(user)
    .GetJsonFromUrl()
    .FromJson<List<GithubRepo>>();

使用 C# .NET 服务客户端使用 ServiceStack 服务

我没有看到报告的行为,您是否在客户端上使用了最新版本的 ServiceStack?

测试生成的 url 被使用(不进行服务调用)的一种方法是直接调用TRequest.ToUrl(method)扩展方法(服务客户端使用),例如

AccountRequest request = new AccountRequest { UserName = "me" };
request.ToUrl("GET").Print(); //  /account/me

当我尝试通过 调用它时,使用了相同的自动生成路由JsonServiceClient,例如:

var client = new JsonServiceClient("http://example.org");
var response = client.Get(request); //calls http://example.org/account/me

ServiceStack 的服务客户端中使用的路由 URL

ServiceStack 将尝试使用与您调用的 DTO 和 HTTP 方法中填充的值匹配的最合适的路由,如果没有匹配的路由,它将回退到预定义的路由

默认情况下,将使用原始预定义路由:

/api/[xml|json|html|jsv|csv]/[syncreply|asynconeway]/[servicename]

但是 ServiceStack 现在还支持 and 的较短别名/reply/oneway例如:

/api/[xml|json|html|jsv|csv]/[reply|oneway]/[servicename]

您可以通过设置标志来选择在客户端中使用它:

client.UseNewPredefinedRoutes = true;
于 2013-03-26T23:34:26.490 回答
1

它不尊重路线

您是否收到 404 或 Handler not found 异常?

确保在配置 AppHost 时将您的“AccountService”类所在的任何程序集添加到“assembliesWithServices”参数中。听起来您的路线没有被 ServiceStack 拾取。

public MyAppHost() : base("my app", typeof(AccountService).Assembly) { }  

您的服务类是什么样的?

像下面这样的东西应该可以工作(不要忘记服务接口)

public class AccountService : Service
{
    public object Any(AccountRequest request)
    {
        return new AccountResponse() { UserName = request.UserName};
    }
}
于 2013-03-26T22:28:58.697 回答
1

Servicestack 支持多种不同的数据格式,例如 JSON、XML、JSV、CSV 等,并支持多种不同的端点来开箱即用地访问这些数据。请在下面找到从 SS 文档的格式部分获取的受支持端点的详细信息。

ServiceStack 提供的客户端使用默认端点,而不是 restful 端点来访问数据。数据仍然可以轻松访问,您可以通过导航到浏览器中的静态 URL 来测试这一点。

宁静的端点

?format={format}您可以通过添加到 URL 的末尾来定义应使用的格式。

  • ?format=json
  • ?format=xml
  • ?format=jsv
  • ?format=csv
  • ?format=htm

例子:http://www.servicestack.net/ServiceStack.Hello/servicestack/hello/World!?format=json

或者,ServiceStack 还可以识别应与 Accept http 标头一起使用的格式:

  • Accept: application/json
  • Accept: application/xml

如您所见,这种方法仅适用于jsonand xml

默认端点

/servicestack/[xml|json|html|jsv|csv]/[syncreply|asynconeway]/[servicename]

例子:

  • /servicestack/xml/[syncreply|asynconeway]/[servicename] 将是 XML
  • /servicestack/json/[syncreply|asynconeway]/[servicename] 将是 JSON

SOAP 端点

SOAP 端点当然只支持 XML。


更新

ServiceStack 客户端不能用于连接到非 ServiceStack Web 服务,因为它们依赖于特定于 ServiceStack 的行为。最好使用RestSharp之类的东西或许多其他可用客户端之一,这些客户端允许您与宁静的 Web 服务进行交互。

于 2013-03-26T21:36:48.953 回答
0

感谢大家的回答。C# 客户端从一开始就将请求发送到正确的地址,我使用 Fiddler 对其进行了调试。只有我没有正确反序列化它。

Account 对象位于data响应的属性中,而不是响应本身。客户端擅长使用 REST 服务,即使它们不是使用 ServiceStack 构建的。这很酷。

于 2013-03-26T23:19:58.187 回答