【问题标题】:Rest calls in c#c#中的休息电话
【发布时间】:2018-09-08 01:00:49
【问题描述】:

我正在为 Rest 通话而苦苦挣扎。这是我的代码,它适用于基本身份验证。

public async Task RunAsync(string name, string value)
{
    using (var handler = new HttpClientHandler { UseDefaultCredentials = true })
    using (var client = new HttpClient(handler))
    {
        var byteArray = Encoding.ASCII.GetBytes("username:password");
        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
        var urlRestGet = HomeController.url;
        client.BaseAddress = new Uri(urlRestGet + "?name=" + name + "&value=" + value + "");
        client.DefaultRequestHeaders.Accept.Clear();
       **1. if(HomeController.contentType.ToLower()=="xml"){
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
        }**
        else if (HomeController.contentType.ToLower() == "json")
        {
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        }

        HttpResponseMessage response = await client.GetAsync(urlRestGet + "?name=" + name + "&value=" + value + "");

        if (response.IsSuccessStatusCode)
        {
            //Get the response
            loginJsonString = await response.Content.ReadAsStringAsync();

            //Converting to xml
            using (var stream = new MemoryStream(Encoding.ASCII.GetBytes(loginJsonString)))
            {
                var output = new XmlDictionaryReaderQuotas();
                xmlResult = XDocument.Load(JsonReaderWriterFactory.CreateJsonReader(stream, output)).ToString();
            }
        }
    }
}

1) 如果内容类型是 application/xml 我是否正确使用代码中的第 1 行部分。

2) 我怎样才能使这段代码更通用。 (当身份验证类型不同时,例如:tokenized 或 cookiebased 我该如何更改。)

【问题讨论】:

  • 有点不相关,但我真的可以推荐使用 restSharp (restsharp.org) 来处理这些事情——这是一个非常强大的库
  • @Mafii 绝对相关。不要重新发明轮子。

标签: c# asp.net-mvc rest


【解决方案1】:

您的代码有几处我不明白。

  1. HomeController.contentType 到底是什么? “HomeController”这个名称表明您正在编写一个 ASP.NET MVC 控制器(服务器端)。尽管您似乎正在编写一些旨在用作 HTTP 客户端的东西。但我在这里可能会被误解或误导。
  2. 您正在读取 Json 响应,然后将其作为 Xml 文档加载?

我会尽量回答。

1) 如果内容类型是 application/xml 我是否正确使用代码中的第 1 行部分。

客户端(您)发送的 Accept 标头告诉服务器您接受给定的内容类型。如果您发送Accept application/xml,您会告诉服务器您喜欢的响应是否为 Xml。

您的代码似乎假定响应的内容类型始终为 Json。

您可以在请求中包含 both application/xml 和 application/json 作为 Accept 标头。服务器应该接受该请求并选择第一个支持的内容类型作为它的响应。

在处理响应时,您应该检查实际的内容类型并适当地处理响应内容。

请记住,Accept 只会告诉服务器您更喜欢这些内容类型。服务器可能决定不尊重您的意愿,并且可以返回它想要的任何内容类型。

2) 我怎样才能使这段代码更通用。 (当身份验证类型不同时,例如:tokenized 或 cookiebased 我该如何更改。)

如果您的意思是在查询参数中进行标记化,您可能应该将查询参数作为集合而不是硬编码的格式化字符串来处理。 查看the NameValueCollection classthis SO question on NameValueCollection to query string

要处理 cookie,您基本上需要复制/重用在下一个请求的响应中返回的 cookie 集合。 创建新的 HttpClient 时请参阅 this SO question on how to inject cookies

...但是使用库要容易得多

正如您已经发现的那样,制作一个健壮的 REST/HTTP 客户端并不是一件容易的事。 正如@Mafii 和@Fildor 已经在 cmets 中指出的那样,已经有许多可用的库。 RestSharp (https://restsharp.org) 非常受欢迎。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 2022-11-23
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    相关资源
    最近更新 更多