我一直在编写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.Flush
和sw.Close
调用,并将它们之后的代码(从GetResponse
移动到设置statusCode
)移动到using (sw)
之外。您还应该处理resp
。