gpt4 book ai didi

servicestack - POST 到 ServiceStack 服务并检索位置 header

转载 作者:行者123 更新时间:2023-12-04 11:55:35 24 4
gpt4 key购买 nike

我正在尝试发布到我的 ServiceStack 服务并从我的 CREATED 实体的响应中检索 Location header 。我不确定使用 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;
}
}

}

最佳答案

Customizing HTTP Responses ServiceStack wiki 页面,用于自定义 HTTP 响应的所有不同方式。

一个 HttpResult只是自定义 HTTP 响应的一种方式。如果您要重定向它,您通常希望包含绝对网址,例如:

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 响应 header 中,要查看返回的整个 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");
});

关于servicestack - POST 到 ServiceStack 服务并检索位置 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13460993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com