我正在尝试使用下面的C#代码发出GET api请求,但失败并显示
System.Net.WebException: The remote server returned an error: (401) Unauthorized.
at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
at System.Net.WebClient.DownloadString(Uri address)
at System.Net.WebClient.DownloadString(String address)
at Rextester.Program.callAPI()
at Rextester.Program.Main(String[] args)
请注意,同一API请求通过postman起作用。
private static void callAPI()
{
WebClient client = new WebClient();
client.UseDefaultCredentials = false;
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
client.Headers.Add("Authorization", "Basic " + Base64Encode("<id:password>"));
client.Headers.Add("Content-Type", "application/json");
client.Headers.Add("Environment-Id", "325");
client.QueryString.Add("query", "%7B%7D");
string reply = client.DownloadString("https://<server-api-url>");
Console.WriteLine(reply);
}
private static string Base64Encode(string plainText)
{
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
var encodedS = System.Convert.ToBase64String(plainTextBytes);
Console.WriteLine(encodedS);
return encodedS;
}
另一个奇怪的事实是,我看到在编码字符串之前打印了异常。我应该反过来考虑。应该先打印编码后的字符串,因为方法调用是在进行api调用之前进行的。
答案 0 :(得分:1)
从@Panagiotis Kanavos得到一些指导后,我跟踪了Fiddler的api调用,并了解到该api调用已被重定向(http状态码-307)。默认情况下,C#客户端配置为在重定向时不传递授权标头。因此,我收到401未经授权的错误。 通过添加对401状态代码的检查并使用授权标头重新发送api请求,这是fixed。
感谢@Panagiotis Kanavos提供帮助