HTTP Post请求返回400 c#

本文关键字:返回 请求 Post HTTP | 更新日期: 2023-09-27 18:02:01

我试图使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);
        }
    }

HTTP Post请求返回400 c#

由于您向远程服务器发送了某种不正确的数据,因此远程服务器给了您一个400错误。您可能能够获得响应并找出确切的错误—远程服务器很可能会给您提供更多信息。然而,我可以看到一个问题与您的帖子数据-客户端秘密需要URL编码。看看它的内容,你会看到它以一个=符号结束。这将被解释为一个特殊字符。我还喜欢更明确地创建字符串,所以这将为您工作:

var postItems = new List<KeyValuePair<string, string>>
{
    new KeyValuePair<string, string>("grant_type", "client_credentials"),
    new KeyValuePair<string, string>("client_id", "client_credentials"),
    new KeyValuePair<string, string>("client_secret", "client_credentials"),
};
string postData = string.Join("&", 
    postItems.Select (kvp => 
        string.Format("{0}={1}", kvp.Key, HttpUtility.UrlEncode(kvp.Value))));

客户端id和secret在形成表单数据时必须分别进行url编码。更新后的postData:

string postData = "grant_type=client_credentials&client_id=" + HttpUtility.UrlEncode(appSettings["my_client_id"]) + "&client_secret=" + HttpUtility.UrlEncode(appSettings["my_client_secret"]);