PowerShell Invoke-WebRequest | Вызов API

Я использую Gitea и пытаюсь создать пользователя с помощью вызова API в PowerShell:

Testing Plateforme : https://try.gitea.io/

API URL : https://try.gitea.io/api/swagger

API Token : 3bb81a498393f4af3d278164b5755fc23b74b785

Username : Will-stackoverflow

Password : willwill

Вот что я пробовал до сих пор:

# Filling my var with some data
$username = "myuser"
$email = "[email protected]"
$full_name = "My User"
$password = "P@$$w0rd"

# Building a hash with my data
$hash = @{
     Email = $($email);
     full_name = $($full_name);
     login_name = $($username);
     Password = $($password);
     send_notify = "false";
     source_id = 0;
     Username = $($username)
}

# Converting my hash to json format
$JSON = $hash | convertto-json
# Displaying my JSON var
$JSON

Invoke-WebRequest -uri "http://try.gitea.io/api/v1/admin/users?access_token=3bb81a498393f4af3d278164b5755fc23b74b785" -Method POST -Body $JSON

Моя переменная $JSON подается правильно:

{
    "Password":  "P@w0rd",
    "full_name":  "My User",
    "Username":  "myuser",
    "Email":  "[email protected]",
    "source_id":  0,
    "login_name":  "myuser",
    "send_notify":  "false"
}

Но есть результат (из моей среды prod, так как я вообще не могу заставить ее работать с помощью онлайн-платформы):

PowerShell Invoke-WebRequest | Вызов API

Мне кажется, что поля "Username", "Email" и "Password" обязательны, но они заполнены в моем отображаемом JSON. Что я упускаю или делаю не так?

РЕДАКТИРОВАТЬ :

Добавление параметра -ContentType 'application/json' в команду Invoke-WebRequest по предложению Тео:

PowerShell Invoke-WebRequest | Вызов API

Я заметил, что после преобразования в json порядок полей изменился. Может быть, в этом проблема? Если да, как сохранить нужное поле в нужном месте?

Will 24.07.2018 17:05

порядок полей не имеет значения. У хеш-таблицы нет определенного порядка

Theo 24.07.2018 17:15

Вы пробовали добавить токен аутентификации в заголовок? Invoke-WebRequest -H 'Authorization: token AUTH_TOKEN_HERE?

Bender the Greatest 24.07.2018 19:48

Если я правильно прочитал сообщение об ошибке, он жалуется на значение в вашем JSON для "send_notify". Попробуйте заменить "send_notify": "false" на "send_notify": $false. Таким образом, вместо строки "false" он получает логическое значение. Я отредактировал свой ответ.

Theo 24.07.2018 21:25
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
3
4
1 659
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Глядя на сайт Swagger UI, мне кажется, что json должен содержать свойства только в нижнем регистре.

{
  "email": "[email protected]",
  "full_name": "My User",
  "login_name": "myuser",
  "password": "P@w0rd",
  "send_notify": $true,
  "source_id": 0,
  "username": "myuser"
}

Также, согласно сайту Swagger, вам необходимо указать -Тип содержимого. Ваш код будет выглядеть так:

# Filling my var with some data
$username = "myuser"
$email = "[email protected]"
$full_name = "My User"
$password = "P@$$w0rd"

# Building a hash with my data
$hash = @{
     email = $($email);          # string
     full_name = $($full_name);  # string
     login_name = $($username);  # string
     password = $($password);    # string
     send_notify = $false;       # boolean
     source_id = 0;              # int
     username = $($username)     # string
}



# Converting my hash to json format
$JSON = $hash | ConvertTo-Json
# Displaying my JSON var
$JSON

# just to make it somewhat easier on the eyes
$token = "3bb81a498393f4af3d278164b5755fc23b74b785"
$url = "http://try.gitea.io/api/v1/admin/users?access_token=$token"

Invoke-WebRequest -uri $url -Method POST -Body $JSON -ContentType 'application/json'

Это то, что я сделал в первую очередь, но поскольку сообщение об ошибке, выдаваемое PowerShell, показывало эти fieldNames с заглавными буквами, я добавил их позже. Не повезло :/

Will 24.07.2018 17:02

Я также считаю, что вам следует добавить -ContentType 'application/json' в свою команду Invoke-WebRequest.

Theo 24.07.2018 17:06

Я обновил свой пост новым получаемым сообщением. Я не знаю, добавляли ли мы эту строку x вперед или назад)

Will 24.07.2018 17:11

..но вы не добавляли -ContentType 'application/json' в команду.

Theo 24.07.2018 17:14

Я сделал Тео, поэтому сообщение изменилось: Invoke-WebRequest -uri "http://localhost:3000/api/v1/admin/users?access_token=xxx" Method POST -ContentType 'application/json' -Body $JSON

Will 24.07.2018 17:18

Другие вопросы по теме