2015-12-20 3 views
-1

Я совершенно не знаком с Python. Я использую GitLab, который предлагает функцию привязки системы, в которой я могу указать URL-адрес, и он отправит данные о событиях в виде данных JSON POST. Когда я создаю URL-адрес RequestBin и предоставляю этот URL-адрес в системном подключении GitLab, тогда в случае любого события, такого как создание проекта, он отправляет детали события, и я могу видеть то же самое в RequestBin, как показано в снимок ниже.Python - Принимать данные POST (raw body)

Теперь я хочу получить данные JSON в некоторой переменной, чтобы я мог обрабатывать ее в соответствии с моей потребностью, но я не уверен, как читать эти данные.

Я видел несколько сообщений, которые объясняют, как читать данные JSON, но как вы можете видеть ниже на скриншоте, ПАРАМЕТРЫ FORM/POST отображаются как Нет. Это сырое тело, которое содержит все детали (в формате JSON):

enter image description here

Я пытался читать данные с помощью Java и работает с кодом показано ниже:

String recv; 
String recvbuff=""; 
BufferedReader buffread = new BufferedReader(new InputStreamReader(request.getInputStream())); 

while ((recv = buffread.readLine()) != null) 
recvbuff += recv; 
buffread.close(); 

System.out.println(recvbuff); 
out.println(recvbuff); 

Ищу что-то подобное в Python.

+0

Так что, если я правильно понимаю, что вы ищете способ настроить простой сервер Python обрабатывать несколько запросов JSON-POST? Я бы предложил CherryPy для этого, довольно легко настроить некоторые функции, принимающие вызовы с помощью JSON http://docs.cherrypy.org/en/latest/basics.html#dealing-with-json – Ixio

+0

Является ли CherryPy альтернативой серверу Apacher ? Кроме того, запрос находится в формате JSON, но он отправляется как необработанные данные, поэтому я не уверен, будет ли то, что вы предложили, работать. – Technext

+1

Голосование закрывается, так как у вас нет конкретного вопроса –

ответ

0

Я предлагаю использовать CherryPy. Это аккуратная библиотека Python, которая позволяет вам создавать простую веб-серверную программу, она очень хорошо подходит для вашего случая использования: она может легко принимать запросы JSON (http://docs.cherrypy.org/en/latest/basics.html#dealing-with-json).

Если вы пишете файл с именем myserver.py со следующим кодом:

#!/usr/bin/python3 
import cherrypy 

class Root(object): 
    @cherrypy.expose 
    @cherrypy.tools.json_in() 
    def index(self): 
     data = cherrypy.request.json 
     # You can manipulate here your json data as you wish 
     print(data['name']) 

if __name__ == '__main__': 
    cherrypy.quickstart(Root(), '/') 

Вы можете просто запустить сервер с помощью командной строки:

python3 myserver.py 

и протестировать его со следующим завитка команда:

curl -H "Content-Type: application/json" -POST http://127.0.0.1:8080 -d '{"name": "test", "path": "/"}' 

Вы тогда увидите test распечатаны на сервере л ог.

+0

Я пробовал ваше предложение, и команда _your_ curl работает, но когда я предоставляю этот URL-адрес веб-крючка моего приложения, журнал ничего не показывает. Как я упомянул в комментарии AlastairMcCormack, я успешно протестировал веб-крючок с помощью Java, но было слишком много задействованных инструментов, и я хотел, чтобы способ _better_ выполнял ту же работу. :(Ответ определенно отправляется как JSON (как показано на скриншоте) приложением, но это как необработанные данные (опять же, как показано на скриншоте). Так что, возможно, мне нужно прочитать все данные, которые отправлены, а не только JSON body (который не содержит фактического вывода). – Technext

+0

Хорошо, ваше приложение запускает webhook на том же сервере, что и ваш файл myserver.py? Поскольку 127.0.0.1:8080 является локальным адресом и не может быть доступен из-за пределов локальной сети Если вы хотите связать IP-адрес своего сервера, просто посмотрите на второй ответ в https://stackoverflow.com/questions/115773/how-do-i-configure-the-ip-address-with-cherrypy – Ixio

+0

Да, приложение работает на одном IP-адресе, и я попытался использовать как открытый, так и закрытый IP-адрес, но безрезультатно. – Technext

0

Приложение Flask не возвращает никаких данных, поэтому вы не увидите ничего возвращенного. Вам необходимо вернуть что-то вроде:

return "test data" 

Ваш скриншот показывает только запрос, а не ответ. Вы не отправили никаких закодированных форматов, поэтому он показывает «Нет».

Правильный Content-типа для JSON является: application/json

+0

Я не уверен, что вы имели в виду, когда вы упомянули о скриншоте, показывающем _only_ ответ. Я создал ссылку в RequestBin и назначил ее в веб-крюке моего приложения. Всякий раз, когда запускается какое-либо событие, например, создание проекта и т. Д., Он отправляет подробности об этом событии в форме JSON и отправляется как необработанные данные, и именно эти данные я хочу принять в некоторой переменной, чтобы я мог ее обработать. – Technext

+0

Пожалуйста, перечитайте мой ответ. Он говорит, что «только показывает ** запрос ** не ответ». Я не понимаю, как работает RequestBin, но все элементы скриншота - это контексты запроса ** не ответ ** –