将GET请求发送到路由中给出的路径

时间:2013-03-26 20:52:51

标签: servicestack

我试图从这样的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。我实际上不知道它发送请求的位置。我没有收到任何错误,响应对象中的所有属性都为null。

我在这里缺少什么?

4 个答案:

答案 0 :(得分:8)

使用第三方REST / HTTP Apis

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

要调用第三方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)扩展方法(服务客户端uss),例如

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方法中填充的值匹配的最合适的路由,如果没有匹配的路由,它将回退到pre-defined routes

默认使用原始预定义路由:

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

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

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

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

client.UseNewPredefinedRoutes = true;

答案 1 :(得分:1)

Servicestack支持许多不同的数据格式,例如JSON,XML,JSV,CSV等,并支持许多不同的端点,可以直接访问这些数据。请从SS文档的formats部分中找到支持的端点的以下详细信息。

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

Restful Endpoints

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

  • ?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

如您所见,此方法仅适用于jsonxml

默认端点

/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服务进行交互。

答案 2 :(得分:1)

它不尊重路线

您是否收到了404或Handler未找到的异常?

确保在配置AppHost时,“AccountService”类所在的任何程序集都会添加到“assembliesWithServices”参数中。听起来好像您的Route没有被ServiceStack接收。

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

您的服务类是什么样的?

下面的内容应该有效(不要忘记服务界面)

public class AccountService : Service
{
    public object Any(AccountRequest request)
    {
        return new AccountResponse() { UserName = request.UserName};
    }
}

答案 3 :(得分:0)

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

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