如何将RestSharp与Ambari Swagger结合使用

时间:2020-07-30 21:00:03

标签: swagger restsharp ambari

如何使用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);

如果我调整密码,它将返回未授权,所以我知道我正在认证。 我认为诀窍将是使RestSharp属性像HttpClient一样。 这就是为什么我通过以下方式删除标题:

 client.DefaultParameters.Clear();

1 个答案:

答案 0 :(得分:0)

我发现它可以与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客户。我能够确定实现我想要的所需的Request和Response json。我还能够确定客户端(工作)和RestSharp(有问题)之间的标头中的差异。通过消除Header差异,我可以使其正常工作。 我使用腻子来获取Swagger json,但是就像我之前说的那样,它定义不明确。