连接到JSON服务器时遇到问题。 在用户手册中:
接口实现为标准HTTP服务。使用该服务需要通过“登录”方法进行身份验证。成功时返回会话ID,除非另有说明,否则必须在每次函数调用时传递。
示例:
登录
描述:用于验证用户。
网址:/登录
签名:Guid登录(字符串ID,字符串用户名,字符串密码)
手册结束
我写了这段代码:
var webAddr = "https://xxx/Login";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(webAddr);
httpWebRequest.ContentType = "application/json; charset=utf-8";
httpWebRequest.Method = "POST";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
string json = "{\"Login\":[{"
+ "\"id\" : 1213213,"
+ "\"username\" : asdasdasd,"
+ "\"password\" : \"adasdsadasd\","
+ "}]}";
streamWriter.Write(json);
streamWriter.Flush();
}
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
MessageBox.Show(result.ToString());
}
消息是:不允许使用方法。 如何从此系列发送和回收数据?
答案 0 :(得分:1)
您正在格式化您的JSON。 JSON应如下所示:
{"id":"1213213","username":"asdasdasd","password":"adasdsadasd"}
注意:引用每个名称和值。并且“登录”不应该是JSON的一部分。
然而,问题实际上是你手动完成这一切。相反,让.NET为您格式化JSON并处理HTTP请求。为此,请为参数创建结构:
class Login
{
public string id { get; set; }
public string username { get; set; }
public string password { get; set; }
}
使用NuGet添加对“Json.Net”和“Microsoft ASP.NET Web API客户端库”的引用。现在你可以这样写:
static async Task Login()
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://www.censored.de/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.Timeout = TimeSpan.FromSeconds(30);
Login l = new Login() { id = "12345", password = "abcde", username = "safsdfasdf" };
var sTemp = JsonConvert.SerializeObject(l); // DEBUG: Just so I can see the JSON
var response = await client.PostAsJsonAsync("/censored/Service.svc/Login", l);
Guid g;
if (response.IsSuccessStatusCode)
{
g = await response.Content.ReadAsAsync<Guid>(); // This gives you the GUID
}
//DEBUG:
// var rawResponse = await response.Content.ReadAsStringAsync();
// Console.WriteLine(response);
}
}
请注意,我使用了“async”和“await”关键字。如果您不熟悉调用异步函数,可以暂时将“await”行更改为:
var response = await client.PostAsJsonAsync("/censored/Service.svc/Login", l).Result;
这会导致带有此消息的400 Bad Request。
{"ErrorMessage":"Die Anmeldedaten sind ungültig.","StackTrace":null}
Google告诉我的意思是凭据错误。我认为这是用户/密码组合所期望的响应。