【问题标题】:Cannot access API with correct username and password(c#-HttpClient)-Unauthorized Request无法使用正确的用户名和密码访问 API(c#-HttpClient)-未经授权的请求
【发布时间】:2017-08-14 11:14:05
【问题描述】:

我正在尝试一个 api 并接收数据。我得到了 api 用户名和密码,但是当我尝试连接时,我收到了未经授权的请求。我的请求标头身份验证有问题。 这是我的代码:

using ApiData;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace GetDataFromApi
{
    class Program
    {
        static void Main(string[] args)
        {

            string uri1 = "https://api.intrinio.com/companies?ticker=AAPL";
            ConnectToApi newapi = new ConnectToApi("username", "password", uri1);
            Console.ReadLine();
        }

        public class ConnectToApi
        {

            public string Username { get; set; }
            public string Password { get; set; }
            public string Request_url { get; set; }

            public ConnectToApi(string username, string password, string url)
            {
                this.Username = username;
                this.Password = password;
                this.Request_url = url;
                GetAPIToken(Username, Password, Request_url);

            }

            private static async void GetAPIToken(string userName, string password, string apiBaseUri)
            {
                try
                {


                    using (var client = new HttpClient())
                    {
                        //setup client
                        client.BaseAddress = new Uri(apiBaseUri);
                        client.DefaultRequestHeaders.Accept.Clear();
                        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes($"{userName}:{password}")));
                        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));


                        //send request
                        var responseMessage = await client.GetStringAsync(apiBaseUri);



                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);

                }
            }
        }
    }

}

如果您的代码中有任何 cmets,我很想听听。

谢谢。

利多

【问题讨论】:

  • 它对我有用 - 这意味着您应该立即更改密码。

标签: c# api httprequest


【解决方案1】:

这可能会有所帮助

您需要获取 RestSharp 才能正常工作

var client = new RestClient("https://api.intrinio.com/companies?ticker=AAPL");
var request = new RestRequest(Method.GET);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("authorization", "Basic MGU0NWIxZmIwZDFlMGNkMDEzY2Y2Y2I5MmRlNjk2N2M6MjNjYjM3OTQ3ZmFmMjQ0OWI1MWRjMWQ1NGU2ZGE1Zjc=");
IRestResponse response = client.Execute(request);

您可以尝试通过

将其转换为对象
 try
        {
            dynamic x = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(response.Content, new Newtonsoft.Json.JsonSerializerSettings() { NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore });
            return x;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            return null;
        }

我确实建议使用http://json2csharp.com/ 创建您的 C# 对象
更多信息

要获取用于授权的值,您可以使用此方法

 public static string Base64Encode(string key)
 {
    var value = System.Text.Encoding.UTF8.GetBytes(key);
    return System.Convert.ToBase64String(value);
 }

要获得准确的值,请确保连接用户名和密码,(用户名第一,密码第二),然后传递给方法

【讨论】:

  • 感谢您的帮助。在 "request.AddHeader("authorization", "Basic MGU0NWIxZmIwZDFlMGNkMDEzY2Y2Y2I5MmRlNjk2N2M6MjNjYjM3OTQ3ZmFmMjQ0OWI1MWRjMWQ1NGU2ZGE1Zjc=")" 行中我应该把用户名和密码放在一起?
  • 该代码包含您的用户名和密码,它们是 URL 64 位基础编码,如果您在授权值上解码,您可以看到它是您的用户名和密码,
  • 如果回答有帮助请采纳,让其他人放心使用
猜你喜欢
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 2022-09-19
  • 2017-07-06
  • 1970-01-01
相关资源
最近更新 更多