我试图从这样的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。
我在这里缺少什么?
答案 0 :(得分:8)
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>>();
我没有看到报告的行为,您是否在客户端上使用最新版本的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将尝试使用与您正在呼叫的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来测试它。
您可以通过将?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
如您所见,此方法仅适用于json
和xml
。
/servicestack/[xml|json|html|jsv|csv]/[syncreply|asynconeway]/[servicename]
示例:
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构建的。这很酷。