【发布时间】:2015-09-27 12:26:16
【问题描述】:
我正在尝试发出 http post 请求以获取 api 令牌。如果成功,它应该返回访问令牌、令牌类型(承载)和 expires_in 的字符串值。
我拥有的代码是一个通用的代码,我希望它能够正常工作。但由于某些原因,它会抛出 400 “远程服务器返回错误。错误请求”的异常。我一直在尝试一切来解决这个问题,而结果并没有改变。
当我调试代码并在输出窗口中查看结果时,数据流出现异常提示“此流不支持查找操作”
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
我怀疑它的发生是由于 postData,它的编码方式。我的客户秘密是这样的:
g/gOvqf5R+FTZZXbwsCbp0WsQjF9B0bl87IBQ8VAJ2Q=
它是否对密钥本身中的字符进行编码,从而构造一个错误的请求?
我也在 POSTMAN 上尝试过这个,它产生了结果,所以 api 没有任何内容。它再次归结为请求内容。这是一个控制台应用程序。我在下面粘贴我的代码,提前感谢您的帮助。
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。与网络服务交互更容易。 -
是的,我也考虑过。实际上我最终可能会这样做,但我很想知道为什么这种方法会失败。谢谢,大卫G
-
你在哪一行得到错误?
-
var response = (HttpWebResponse)request.GetResponse();这就是错误发生的地方。我认为请求正文的格式不正确,它无法产生响应,因为 sytanx-wise 它似乎是正确的。 -
您可能需要对客户端密码进行 URL 编码,因为它包含某些字符(例如
=),请尝试这样做。
标签: c# httpwebrequest http-post http-status-code-400 httpcontent