HttpClient post возвращает неверный запрос в c #, работает в почтальоне - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь получить доступ к конечной точке покоя, https://api.planet.com/auth/v1/experimental/public/users/authenticate. Ожидается JSON в теле запроса.

Я могу получить запрос на работу в Почтальоне, но не использую c #. С помощью почтальона я получаю ожидаемое недействительное сообщение электронной почты или пароль, но с моим кодом я получаю «Плохой запрос», независимо от того, что я пытаюсь.

Вот код, который делает запрос

private void Login()
{
    try
    {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri("https://api.planet.com/");
        client.DefaultRequestHeaders.Accept.Clear();
        //ClientDefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
        Data.User user = new Data.User
        {
            email = "myemail@company.com",
            password = "sdosadf"
        };
        var requestMessage = JsonConvert.SerializeObject(user);
        var content = new StringContent(requestMessage, Encoding.UTF8, "application/json");
        var response = client.PostAsync("auth/v1/experimental/public/users/authenticate", content).Result;
        Console.WriteLine(response.ToString());
    }
    catch (WebException wex )
    {
        MessageBox.Show(wex.Message) ;
    }
}
class User
{
    public string email;
    public string password;
}

Вот скриншоты с работающего почтальона enter image description here

enter image description here

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Чтобы заставить это работать, нужно было изменить заголовок контента «тип контента».По умолчанию HTTPClient создавал content-type: application/json;characterset= UTF8.Я сбросил и заново создал заголовок контента, и он работал.

content.Headers.Remove("Content-Type");
content.Headers.Add("Content-Type", "application/json");
1 голос
/ 08 июня 2019

Проблема в том, что вы пытаетесь вызвать метод async, не дожидаясь ответа, используя await method или var task = method; task.Wait(). Поэтому, когда вы в конечном итоге делаете response.ToString(), он возвращает текст, который вы видите.

Один из способов справиться с этим в неасинхронном методе заключается в следующем:

var task = client.PostAsync("auth/v1/experimental/public/users/authenticate", content);
task.Wait();
var responseTask = task.Content.ReadAsStringAsync();
responseTask.Wait();
Console.WriteLine(responseTask.Result);

Другой способ - сделать текущий метод асинхронным, выполнив private async void Login(), а затем выполнить:

var postResp = await client.PostAsync("auth/v1/experimental/public/users/authenticate", content);
var response = await postResp.Content.ReadAsStringAsync();
Console.WriteLine(response);
...