Delphi Метод Datasnap RESTful API работает в браузере, но не с POST в python - PullRequest
0 голосов
/ 06 мая 2020

Я новичок в веб-разработке и особенно в REST. Я пытаюсь получить данные пользователя по следующей ссылке, которая представляет собой службу REST, созданную с помощью Datasnap в Delphi: http://XXXXXX: XXX / datasnap / rest / Tdm / LoginUser

У меня нет доступа к серверной части этой службы (или к любому ее коду), однако мне все еще нужно выяснить, как с ней работать.

Фактически вы можете использовать его в браузере вот так: http://XXXXX: XXX / datasnap / rest / Tdm / LoginUser / ANY_STRING / EMAIL@EMAIL.COM/PASSWORD

И он отлично работает, печатает ответ JSON со всеми пользовательскими данными в это.

Теперь я пытаюсь сделать то же самое, но на этот раз с запросом POST через библиотеку запросов в Python. Вот часть рассматриваемого кода:

import requests
import json

task = {
    'FAppKey':'test', 
    'Email':'REDACTED :)', 
    'Password':'12345' 
    }
header = {
    'Content-Type': 'application/json; charset=utf-8', 
    'Connection': 'keep-alive', 
    'Accept': 'text/html', 
    'Accept-Encoding': 'identity'
    }

response = requests.post('http://XXXXX:XXXX/datasnap/rest/Tdm/LoginUser/', 
    json=json.dumps(task), 
    headers=header)
print(response, response.text)

Как видите, я пытаюсь отправить запрос POST, содержащий объект JSON с данными указанного c пользователя, которого я хочу увидеть. Однако это не работает. Оператор печати возвращает следующее:

{"error": "Метод Tdm.updateLoginUser не найден в списке методов сервера"}

Что странно, потому что там в API действительно нет такого метода, называемого «updateLoginUser».

Я уверен, что привязка данных и метод LoginUser, в частности, настроены правильно, а проблемы, с которыми я сталкиваюсь, - с моей стороны. Что я делаю не так и как правильно выполнить POST в REST API? Почему Datasnap выводит ошибку, ссылающуюся на другой несуществующий метод?

РЕДАКТИРОВАТЬ: Исправлено!

Пара вещей:

  • Когда вы используете POST, DataSnap автоматически добавляет «update» к имени метода (так что «Foo» становится «updateFoo»), ожидая, что у вас будет метод там. Если вы этого не сделаете, вы должны заключить имя метода в кавычки, что, конечно же, в кодировке URL-адреса: "% 22"
  • Когда вы передаете несколько параметров в JSON через POST, у вас есть чтобы поместить каждый параметр в список / массив, а затем поместить этот список в dict с ключом «_parameters», например:
task = { "_parameters" : ["param1", "param2", "param3"] }

Для всего этого можно найти документацию здесь .

...