首页 > 解决方案 > 在 ServiceStack JsonServiceClient 上设置 Accept 标头

问题描述

我正在使用 ServiceStack.JsonServiceClient 尝试使用 Accept 标头的自定义值发出 URL 请求,但无法找到进行调用的方法。

服务调用是通过 GitHub API 检索存储库的主题。这目前是一项预览功能,需要在接受标头上作为自定义媒体类型发送附加信息。(https://developer.github.com/v3/repos

我正在使用服务堆栈并对 API 端点进行 C# .NET 调用,并且我正在努力寻找合适的方法来更新请求上的接受标头。我尝试了两种策略。

  1. 使用标头创建一个 HttpWebRequest 并将其传递给客户端

            Uri uri = new Uri(requestUrl, UriKind.Absolute);
            HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(uri);
            webRequest.Accept = "application/vnd.github.mercy-preview+json";
    
            HttpWebResponse webResponse = client.Get<HttpWebResponse>(webRequest);
    

    requestUrl是形式的字符串https://api.github.com/repos/{owner}/{repo}?access_token={token}。它成功地创建了 Uri 和 HttpWebRequest 对象,但随后在 上抛出异常client.Get,声称Invalid URI: The format of the URI could not be determined.

    使用字符串 URL 调用 API:HttpWebResponse webResponse = client.Get<HttpWebResponse>(requestUrl);成功且没有问题(但未传递自定义标头值)。

  2. 在客户端本身上设置标头。client.AddHeaders抛出异常,因为Accept是受限制的标头。我一直无法找到任何其他方法来直接在客户端上设置标头(尽管这可能是最好的解决方案)。

谢谢,如果还有什么我可以提供的,请告诉我。

标签: c#.netservicestackgithub-api

解决方案


您可以使用RequestFilter来修改HttpWebRequest发送请求之前,例如:

var client = new JsonServiceClient(baseUrl) {
    RequestFilter = req => req.Accept = acceptHeader
};

注意:ServiceStack 的C#/.NET 服务客户端只能用于调用 ServiceStack 服务。要调用 3rd Party API,您应该改用HTTP Utils,例如:

var body = url.GetStringFromUrl(requestFilter: req => {
    req.Accept = acceptHeader;
});

推荐阅读