POST到ServiceStack服务并检索位置标头



我正在尝试POST到我的ServiceStack服务,并从我的CREATED实体的响应中检索Location标头。我不确定使用IReturn是否有效,但我不确定如何从我的客户端访问响应标头。有人能帮助我理解如何正确地与HttpResult交互吗?在代码的底部有一个测试用例来演示我想要做什么。这是结束语:

public class ServiceStackSpike
{
public class AppHost : AppHostHttpListenerBase
{
public AppHost() : base("TODOs Tests", typeof(Todo).Assembly) { }
public override void Configure(Container container)
{
//noop
}
}

[Route("/todos", "POST")]
public class Todo:IReturn<HttpResult>
{
public long Id { get; set; }
public string Content { get; set; }
public int Order { get; set; }
public bool Done { get; set; }
}

public class TodosService : Service
{
public object Post(Todo todo)
{
//do stuff here
var result = new HttpResult(todo,HttpStatusCode.Created);
result.Headers[HttpHeaders.Location] = "/tada";
return result;
}

}

public class NewApiTodosTests : IDisposable
{
const string BaseUri = "http://localhost:82/";
AppHost appHost;
public NewApiTodosTests()
{
appHost = new AppHost();
appHost.Init();
appHost.Start(BaseUri);                
}

[Fact]
public void Run()
{
var restClient = new JsonServiceClient(BaseUri);

var todo = restClient.Post(new Todo { Content = "New TODO", Order = 1 });
Assert.Equal(todo.Headers[HttpHeaders.Location], "/tada"); //=>fail
}
public void Dispose()
{
appHost.Dispose();
appHost = null;
}
}
}

有关自定义HTTP响应的所有不同方法,请参阅自定义HTTP响应ServiceStack wiki页面。

HttpResult只是自定义HTTP响应的一种方式。如果你要重定向它,你通常希望包括绝对Url,例如:

public object Post(Todo todo)
{
var todo = ...;
return new HttpResult(todo, HttpStatusCode.Created) { 
Location = base.Request.AbsoluteUri.CombineWith("/tada")
};
}

注意:HTTP客户端永远不会看到HttpResultDTO。HttpResult本身不是DTO,它的唯一目的是捕获和修改您想要的自定义HTTP响应。

所有ServiceStack客户端将返回的是HTTP主体,在本例中是Todo响应DTO。Location确实添加到了HTTP响应标头中,要查看返回的整个HTTP响应,您应该使用HTTP嗅探器,如Fiddler、WireShark或Chrome的WebInspector。

如果你想使用ServiceStack的HTTP客户端访问它,你需要添加一个响应过滤器,让你可以访问HttpWebResponse,例如:

restClient.ResponseFilter = httpRes => {
Assert.Equal(httpRes.Headers[HttpHeaders.Location], "/tada"); 
};
Todo todo = restClient.Post(new Todo { Content = "New TODO", Order = 1 });

使用Web请求扩展检查响应标头

如果你只想检查HTTP响应,另一个轻量级的替代方法是使用ServiceStack的方便的WebRequest扩展方法,例如:

var url = "http://path/to/service";
var json = url.GetJsonFromUrl(httpRes => {
Assert.Equal(httpRes.Headers[HttpHeaders.Location], "/tada"); 
});

最新更新