C#使用HttpWebResponse获取JSON编码的字典以及错误的状态代码



我一直在编写Minecraft会话库。基本上,它有Authenticate()和Refresh()等方法来获取启动器使用的访问令牌(源)。其中一个方法PostHTTP()获取2个参数,并输出一个参数(JObject JSON、字符串端点、out int statuscode[出于调试原因])。正确的方法名称是:

public static string PostHTTP(JObject JSON, string endpoint, out int statusCode)

现在,例如,当程序使用Authenticate(启动器不直接使用PostHTTP()方法,而是由Authenticate()等其他方法使用)并提供用户名和密码时,Authenticate()方法将用户/通行证组合解析为JSON.NETJObject,并将其发送到PostHTTP(),如下所示:

public static string Authenticate(string username, string password, out int statusCode)
{
JObject toPost = new JObject(
new JProperty("agent",
new JObject(
new JProperty("name", "Minecraft"),
new JProperty("version", 1))),
new JProperty("username", username),
new JProperty("password", password));
return PostHTTP(toPost, "authenticate", out statusCode);
}

PostHTTP()方法中,这是当前代码:

public static string PostHTTP(JObject JSON, string endpoint, out int statusCode)
{ // endpoint = authenticate, invalidate, etc.
string response = null;
try
{
var req = (HttpWebRequest)WebRequest.Create(Vars.AuthServer + endpoint);
req.ContentType = "application/json";
req.Method = "POST";
using (var sw = new StreamWriter(req.GetRequestStream()))
{
sw.Write(JSON.ToString());
sw.Flush();
sw.Close();
var resp = (HttpWebResponse)req.GetResponse();
using (var sr = new StreamReader(resp.GetResponseStream()))
{
response = sr.ReadToEnd();
}
//Console.WriteLine(response);
statusCode = (int)resp.StatusCode;
}
}
catch (WebException)
{
statusCode = 69;
return null;
}
return response;
}

现在,例如,用户输入了错误的用户名/密码组合。身份验证服务器将返回:

  • 一个合适的非200 HTTP状态代码
  • JSON编码的字典,格式如下:

    {"error":"错误的简短描述",
    "errorMessage":"可以向用户显示的较长描述",
    "cause":"cause of the error"//可选

问题是,到目前为止,代码只捕获状态代码及其消息(The remote server returned an error: (403) Forbidden)
如何获取JSON字典和状态代码

您需要的是WebException.Response属性。如果接收到一些带有错误状态代码的响应,则它将不为空。

附言:您可以删除sw.Flushsw.Close调用,并将它们之后的代码(从GetResponse移动到设置statusCode)移动到using (sw)之外。您还应该处理resp

相关内容

  • 没有找到相关文章

最新更新