我正在尝试发送一个 HTTP POST 请求以获取 API 令牌。如果成功,它应该返回访问令牌、令牌类型(bearer)和过期时间的字符串值。
我的代码是通用的,我原本期望能够正常运行。但出现了 400 的异常错误“远程服务器返回了错误请求”。我一直在尝试各种方法解决这个问题,但结果并没有改变。
当我调试代码并在 Output 窗口中查看结果时,会出现有关数据流的异常,显示“此流不支持搜索操作”。
我的疑惑是它是否由于postData的编码方式而发生。我的客户端密钥类似于:
我的代码是通用的,我原本期望能够正常运行。但出现了 400 的异常错误“远程服务器返回了错误请求”。我一直在尝试各种方法解决这个问题,但结果并没有改变。
当我调试代码并在 Output 窗口中查看结果时,会出现有关数据流的异常,显示“此流不支持搜索操作”。
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
我的疑惑是它是否由于postData的编码方式而发生。我的客户端密钥类似于:
它是否对密钥本身中的字符进行编码,从而构造出错误的请求?我还在POSTMAN上尝试过这个问题,并得到了结果,所以API没有问题。问题仍然在于请求内容。这是一个控制台应用程序。我将我的代码粘贴在下面,并提前感谢您的帮助。g/gOvqf5R+FTZZXbwsCbp0WsQjF9B0bl87IBQ8VAJ2Q=
public static APIModel GenerateApiKey()
{
var appSettings = ConfigurationManager.AppSettings;
try
{
var urlToCall = string.Format("https://app.example.com/token");
var uri = new Uri(urlToCall);
var request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "POST";
string postData = "grant_type=client_credentials&client_id=" + appSettings["my_client_id"] + "&client_secret=" + appSettings["my_client_secret"];
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
var response = (HttpWebResponse)request.GetResponse();
APIModel bearerToken;
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
string jsonFromServer = sr.ReadToEnd();
bearerToken = JsonConvert.DeserializeObject<APIModel>(jsonFromServer);
}
response.Close();
return bearerToken;
}
catch (Exception e)
{
throw new Exception("Error getting a response from API " + e.Message);
}
}
HttpClient
而不是WebRequest
。这样更容易与 Web 服务进行交互。 - DavidGvar response = (HttpWebResponse)request.GetResponse();
这就是错误发生的地方。我猜测请求体格式不正确,无法产生响应,因为从语法上看似乎是正确的。 - Yavar Hasanov=
),尝试这样做。 - DavidGstring postData = "grant_type=client_credentials&client_id=" + HttpUtility.UrlEncode(appSettings["my_client_id"]) + "&client_secret=" + HttpUtility.UrlEncode(appSettings["my_client_secret"]);
问题解决了。谢谢。 - Yavar Hasanov