Вызов REST из Windows Phone 8.1 с использованием PostAsync, HttpClient & Json

Мой вопрос очень похож на вызов методов MVC4 WebAPI из C# Metro UI Client с использованием 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 всегда возвращал бы короткий фрагмент HTML с https://m.vente-privee.com/f/fail_int.png в нем, указывая, что вызов не удался. Тот же самый вызов, встроенный в Postman в Chrome, возвращает следующую успешную строку:

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

Почтальон успешный звонок скриншот

Ты хоть представляешь, что я делаю неправильно в своем коде на C#? Благодарю.

1 ответ

Решение

Здесь есть две проблемы.

Проблема 1 - Использование HttpClient BaseAddress

Связанный: Почему HttpClient BaseAddress не работает?

  1. Удостовериться baseAddress заканчивается косой чертой (/).
  2. В этом вызове избавьтесь от передней косой черты (/) и не дописывать 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);
Другие вопросы по тегам