C#JSON POST连接(方法不允许)

时间:2015-03-27 13:08:27

标签: c# json

连接到JSON服务器时遇到问题。 在用户手册中:

接口实现为标准HTTP服务。使用该服务需要通过“登录”方法进行身份验证。成功时返回会话ID,除非另有说明,否则必须在每次函数调用时传递。

  • 发送或接收数据时的预期数据格式为JSON。
  • 必须使用POST传递所有数据。
  • 会话ID的类型为Guid

示例:

  

登录

     

描述:用于验证用户。

     

网址:/登录

     

签名: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());

        }

消息是:不允许使用方法。 如何从此系列发送和回收数据?

1 个答案:

答案 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告诉我的意思是凭据错误。我认为这是用户/密码组合所期望的响应。