Метод Azure Easy Apis InvokeApi вызывает GET вместо POST

В настоящее время я работаю над созданием пользовательской проверки подлинности для приложения Xamarin.Android с помощью Azure. Я успешно создал свой API, и он правильно возвращает значения при отправке необработанных полезных данных с помощью расширенного клиента REST.

Сейчас я пытаюсь реализовать это на Xamarin.Android с помощью Azure MobileServiceClient SDK, и при использовании метода invokeApi, как показано ниже в моем коде, я получаю исключение, указывающее, что он вызывает GET вместо POST. Кто-нибудь знает, что я могу делать неправильно?

ex.Message возвращает

«Не удается получить /api/register?username=azureAccountTest&password=testingpassword»

    public async Task RegisterAsync()
    {
        Dictionary<string, string> user = new Dictionary<string, string>
        {
            { "username", username },
            { "password", password }
        };
        try
        {
            CancellationToken ct;
            var result = await client.InvokeApiAsync("register", HttpMethod.Post, user, ct);
        }
        catch(Exception ex)
        {
            var message = ex.Message;
        }
    }

person Juan Chavez    schedule 08.09.2017    source источник


Ответы (1)


Согласно вашему описанию, я протестировал эту проблему на своей локальной стороне и смог получить authenticationToken следующим образом:

введите здесь описание изображения

Вы использовали следующий метод для InvokeApiAsync:

public Task<JToken> InvokeApiAsync(string apiName, HttpMethod method, IDictionary<string, string> parameters, CancellationToken cancellationToken = default(CancellationToken));

Примечание. В нем говорится, что дополнительные данные будут отправлены через строку запроса.

Насколько я понимаю, вы можете обратиться к следующему методу отправки дополнительных данных через содержимое HTTP следующим образом:

JObject user = new JObject();
user.Add("username", "bruce");
user.Add("password", "123456");
var result = await App.MobileService.InvokeApiAsync("/.auth/login/custom", HttpMethod.Post, user, ct);

Кроме того, вам необходимо указать конечную точку mobileAppUri с https при развертывании на стороне Azure. Вот аналогичная проблема, вы можете обратиться к здесь. Кроме того, я бы рекомендовал вам обратиться к книге Адриана Холла о Пользовательская аутентификация.

ОБНОВЛЕНИЕ:

Основываясь на вашем комментарии, я проверил пользовательскую аутентификацию и нашел следующую заметку из книги Адриана Холла о Пользовательская аутентификация:

Вы должны включить аутентификацию/авторизацию в службе приложений. Установите для параметра Действие при отсутствии аутентификации запроса значение Разрешить запрос (без действий) и не настраивайте ни одного из поддерживаемых поставщиков аутентификации.

person Bruce Chen    schedule 11.09.2017
comment
На самом деле я только что обнаружил что-то новое в ходе тестирования, и похоже, что мой код работает, когда аутентификация/авторизация отключены на моем портале Azure. Я могу получить токен авторизации и пользовательский объект. Это наводит меня на мысль, что проблема заключается в том, как маршрутизируется мой API. Я заметил, что вы перенаправили свой собственный логин в /.auth/custom/login, но мой перенаправляется в /api/register, поэтому я попытаюсь изменить это и проверить, решит ли это проблему, с которой я столкнулся. - person Juan Chavez; 12.09.2017
comment
Вы решили эту проблему, вам нужна дополнительная помощь? - person Bruce Chen; 25.09.2017
comment
Я все еще пытаюсь решить эту проблему, с тех пор я переключился с Node.js на C # для серверной части, но похоже, что авторизация/аутентификация должна быть отключена для запросов POST. Так что я могу просто оставить это так на данный момент. - person Juan Chavez; 26.09.2017
comment
Я проверил книгу Адриана Холла и обновил свой ответ соответствующей заметкой. Вы правы, отключите аутентификацию/авторизацию или следуйте инструкциям Адриана Холла по использованию пользовательской аутентификации. - person Bruce Chen; 27.09.2017
comment
Спасибо за помощь! Ошибка новичка, не понял, что я не настроил свой MobileServiceClient с HTTPS. Изменение его с http://appurl.azurewebsites.net на https://appurl.azurewebsites.net решило мою проблему. - person Juan Chavez; 29.09.2017