繁体   English   中英

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

[英]C# JSON POST connect (Method not allowed)

我无法连接到JSON服务器。 在用户手册中:

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

  • 发送或接收数据时,预期的数据格式为JSON。
  • 必须使用POST传递所有数据。
  • 会话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());

        }

消息是:不允许使用方法。 如何从该服务器发送和接收数据?

您的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);

    }
}

请注意,我使用了“异步”和“等待”关键字。 如果您不熟悉调用异步函数,则可以暂时将“ await”行更改为:

var response = await client.PostAsJsonAsync("/censored/Service.svc/Login", l).Result;

这将导致此消息出现400错误的请求。

{"ErrorMessage":"Die Anmeldedaten sind ungültig.","StackTrace":null}

Google告诉我的意思是凭据错误。 我假设这是对这种用户/密码组合的期望。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM