c# - 在 ServiceStack JsonServiceClient 上设置 Accept 标头
问题描述
我正在使用 ServiceStack.JsonServiceClient 尝试使用 Accept 标头的自定义值发出 URL 请求,但无法找到进行调用的方法。
服务调用是通过 GitHub API 检索存储库的主题。这目前是一项预览功能,需要在接受标头上作为自定义媒体类型发送附加信息。(https://developer.github.com/v3/repos)
我正在使用服务堆栈并对 API 端点进行 C# .NET 调用,并且我正在努力寻找合适的方法来更新请求上的接受标头。我尝试了两种策略。
使用标头创建一个 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);
成功且没有问题(但未传递自定义标头值)。在客户端本身上设置标头。
client.AddHeaders
抛出异常,因为Accept
是受限制的标头。我一直无法找到任何其他方法来直接在客户端上设置标头(尽管这可能是最好的解决方案)。
谢谢,如果还有什么我可以提供的,请告诉我。
解决方案
您可以使用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;
});
推荐阅读
- mysql - MySQL 查询客户尚未选择的日期
- magento - 在 magento 2.3 中从外部服务器导入图像
- python - 熊猫:字典列到键和值列
- c - 如何将文件的内容存储到数组中(直到其最大容量)
- html - 水平滚动菜单的问题
- java - 如何在 Java 中从 Parquet 文件中获取前 n 行而不下载整个文件
- loops - 使用 ansible_hostnames 的 Ansible 循环
- javascript - 在扩展原生 Javascript 类的功能时,是否需要使用 this.valueOf()?
- ios - 禁用长按返回按钮(标注菜单)
- flutter - 如何将 RevenueCat 集成到我的颤振示例应用程序中?