swagger - 如何将 RestSharp 与 Ambari Swagger 一起使用
问题描述
如何使用 RestSharp 客户端连接到 Ambari 的 Swagger 界面?
此代码有效并返回预期的 json:
HttpClientHandler handler = new HttpClientHandler
{
Credentials = new System.Net.NetworkCredential("xxx", "yyyyy")
};
using (var httpClient = new HttpClient(handler))
{
var activationUrl = "https://aaaa.azurehdinsight.net";
var uri = new Uri(activationUrl + "/api/v1/users");
var response = await httpClient.GetAsync(uri);
Assert.IsTrue(response.IsSuccessStatusCode);
var result = await response.Content.ReadAsStringAsync();
}
此代码不起作用并返回 406 NotAcceptable:
var client = new RestSharp.RestClient("https://aaaa.azurehdinsight.net/api/v1/");
var credentials = new System.Net.NetworkCredential("xxx", "yyyy");
client.Authenticator = new NtlmAuthenticator(credentials);
client.DefaultParameters.Clear();
var request = new RestSharp.RestRequest("users", RestSharp.Method.GET);
var response = await client.ExecuteAsync<string>(request);
如果我调整密码,它会返回未经授权,所以我知道我正在验证。我认为诀窍是制作像 HttpClient 这样的 RestSharp 属性。这就是为什么我删除了标题:
client.DefaultParameters.Clear();
解决方案
我发现这可以与 RestSharp 一起使用:
var client = new RestSharp.RestClient("https://xxxx.azurehdinsight.net/api/v1/");
var credentials = new System.Net.NetworkCredential("yyyy", "ZZZZzzzz");
client.Authenticator = new NtlmAuthenticator(credentials);
//must pass this header
client.DefaultParameters.Add(new RestSharp.Parameter("X-Requested-By", "my_computer_name", RestSharp.ParameterType.HttpHeader));
var request = new RestSharp.RestRequest("users", RestSharp.Method.GET);
//Accept Header cannot be passed
// "{Accept=application/json, text/json, text/x-json, text/javascript, application/xml, text/xml}"
request.OnBeforeRequest = (http) =>
{
Debug.WriteLine(http.Headers.Count());
var header = http.Headers.Where(h => h.Name == "Accept");
http.Headers.Remove(header.First());
Debug.WriteLine(http.Headers.Count());
};
request.RequestFormat = RestSharp.DataFormat.Json;
var response = await client.ExecuteAsync<string>(request);
Assert.IsTrue(response.StatusCode == System.Net.HttpStatusCode.OK);
其他经验教训:
- SwaggerHub https://swagger.io/tools/swaggerhub/从 swagger json 创建最可接受的客户端。
- Swagger json 对于 Ambari 的实现很差。无论类生成器如何,都会出现问题。
- 如果您让它与 Ambari/HDInsight 的一个版本一起使用,它可能由于模型更改而无法与其他版本一起使用。
- 我最终使用 Fiddler 窃听了 Ambari 客户端。我能够确定实现我想要的所需的请求和响应 json。我还能够确定客户端(工作)和 RestSharp(有问题)之间的标头差异。通过删除标题差异,我可以让它工作。我使用 putty 来获取 Swagger json,但就像我之前所说的,它的定义很差。
推荐阅读
- nuxt.js - 在 Nuxt 项目中使用 Vuetify 和 @nuxt/vuetify 的好处
- image-processing - 通过分层源图像自动生成随机构图**无需创建重复项**
- django - 在 Django 中覆盖用户的检查密码
- nginx - Nginx 收到事件“ngx_master_****”5 秒未发出信号
- java - 我在 XSLT 撒克逊解析器中遇到异常
- powershell - Powershell中不存在特定对象属性时如何删除条目?
- location - 在python中使x轴穿过y = 0
- azure-devops - 完成 Azure DevOps 中“工作项”列表中的工作项
- apache-kafka - ksqlDB - 如何为生产者设置 batch.size 和 linger.ms 以优化压缩
- javascript - Vue过渡在高度上缩小div并移动到下一个div