使用 PostAsync、HttpClient 和 Json 从 Windows Phone 8.1 调用 REST

Posted

技术标签:

【中文标题】使用 PostAsync、HttpClient 和 Json 从 Windows Phone 8.1 调用 REST【英文标题】:Calling REST from Windows Phone 8.1 using PostAsync, HttpClient & Json 【发布时间】:2014-06-30 00:10:56 【问题描述】:

我的问题与 Calling MVC4 WebAPI methods from C# Metro UI Client using PostAsync, HttpClient & Json 这不足以解决我的问题。

这是我在 Windows Phone 8.1 项目中的代码:

using (var httpClient = new HttpClient())
            
                httpClient.BaseAddress = new Uri(baseAddress);
                httpClient.DefaultRequestHeaders.Accept.Clear();
                httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "YW5vbnltb3VzOmFub255bW91cw==");

                var message = " \"userName\" : \"WebAppUser\", \"password\" : \"M@mie!duCanta1l\" ";
                var json_object = JsonConvert.SerializeObject(message);


                HttpContent content = new StringContent(json_object.ToString(), Encoding.UTF8);
                content.Headers.ContentType = new MediaTypeHeaderValue("application/json");


                HttpResponseMessage response = httpClient.PostAsync(baseAddress + "/s/VpCredentials/1.0/IAuthentication/REST_JSON/Validate", content).Result;
                string statusCode = response.StatusCode.ToString();

                response.EnsureSuccessStatusCode();
                Task<string> responseBody = response.Content.ReadAsStringAsync();
            

responseBody 总是会返回一小段带有https://m.vente-privee.com/f/fail_int.png 的html,表示调用失败。 Postman in Chrome 中内置的相同调用返回以下成功字符串:


    "ValidateResult": 
        "Expiration": "/Date(1404214568532+0200)/",
        "Token": "P36Hm9K9zI1gm75hfOqI6hudfdGw8y7Zu1fVgbaSHp7ayvfLUn4YtNxU/8siJ7Wa",
        "UserName": "WebAppUser"
    ,
    "result": 1,
    "analytics": true

您知道我在 C# 代码中做错了什么吗? 谢谢。

【问题讨论】:

【参考方案1】:

这里有两个问题。

问题 1 - HttpClient BaseAddress 的使用

相关:Why is HttpClient BaseAddress not working?

    确保 baseAddress 以正斜杠 (/) 结尾。

    在此调用中,去掉前导正斜杠 (/) 并且不要在前面加上 baseAddress,它会自动添加:

    (问题)

    httpClient.PostAsync(baseAddress + "/s/VpCredentials/1.0/IAuthentication/REST_JSON/Validate", content).Result;
    

    (已修正)

    httpClient.PostAsync("s/VpCredentials/1.0/IAuthentication/REST_JSON/Validate", content).Result;
    

问题 2 - 请求正文 JSON 的创建

不要这样做:

var message = " \"userName\" : \"WebAppUser\", \"password\" : \"M@mie!duCanta1l\" ";
var json_object = JsonConvert.SerializeObject(message);

这是创建一个包含 JSON 的 JSON 序列化字符串 - 一种双编码形式,这很可能不是您想要的。您通常不应该在代码中创建 JSON 数据字符串文字。

这样做:

var message = new

    userName = "WebAppUser",
    password = "M@mie!duCanta1l"
;
var json_object = JsonConvert.SerializeObject(message);

【讨论】:

蒂莫西,我应用了你的更正,它奏效了。非常感谢!

以上是关于使用 PostAsync、HttpClient 和 Json 从 Windows Phone 8.1 调用 REST的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 HttpClient.PostAsync 发送 XML 内容?

对象在 PostAsync 与 HttpClient 之后被释放

HttpClient.PostAsync 的字符编码问题

为啥 HttpClient.PostAsync 似乎将请求作为 GET 而不是 POST 发送?

异步等待 HttpClient.PostAsync 调用

如何等待PostAsync返回?