POST到ServiceStack服务和检索Location头(POST to ServiceSta

2019-07-03 23:46发布

我试图张贴到我ServiceStack服务和检索从我创建的实体的响应的Location头。 我不知道使用IReturn是否是有效的,但我不知道如何从我的客户端访问的响应头。 有人可以帮助我了解如何与HttpResult正确的交互? 有一个测试情况下,在代码底部证明什么,我想做的事情。 这里的codz:

    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;
        }
    }

}

Answer 1:

请参阅自定义HTTP响应进行自定义HTTP响应的所有不同的方式ServiceStack维基页面。

一个HttpResult只是一种自定义HTTP响应。 您一般要包括绝对URL,如果你要重定向它,例如:

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

注意HTTP客户端将永远不会看到一个HttpResult DTO。 HttpResult 不是DTO本身,它的唯一目的是捕捉和修改所需的定制HTTP响应。

所有ServiceStack客户端将返回是HTTP主体,在这种情况下是Todo响应DTO。 该位置确实添加到HTTP响应头,并看到返回你应该使用诸如Fiddler,是Wireshark或者Chrome的WebInspector一个HTTP嗅探器的整个HTTP响应。

如果你想使用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"); 
});


文章来源: POST to ServiceStack Service and retrieve Location Header