Отправка запроса POST в мой RESTful API(Python-Flask), но получение запроса GET
Я пытаюсь отправить триггер на веб-крючок Zapier в форме запроса POST, содержащего JSON. Это работает нормально, если я просто отправляю запрос POST через локальный скрипт на python.
Я хочу создать RESTful API, который запускает триггер Zapier, когда вызывается конечная точка create-row-in-gs.
Как видите, я отправляю вызов API запроса POST в кластер Hasura. Но вместо того, чтобы получить ответ "200 OK SUCCESS", я получаю "Ошибка 200 OK", что означает, что запрос обрабатывается как запрос GET, а не как запрос POST.
test.py
#Python 3 Script to send a POST request containing JSON
import json
import requests
api_url = 'http://app.catercorner16.hasura-app.io/create-row-in-gs'
create_row_data = {'id': '1235','name':'Joel','created-on':'27/01/2018','modified-on':'27/01/2018','desc':'This is Joel!!'}
r = requests.post(url=api_url, data=create_row_data)
print(r.status_code, r.reason, r.text)
server.py (работает на кластере Hasura)
from src import app
from flask import jsonify,request,make_response,url_for,redirect
from json import dumps
from requests import post
url = 'https://hooks.zapier.com/hooks/catch/xxxxx/yyyyy/'
@app.route('/create-row-in-gs', methods=['GET','POST'])
def create_row_in_gs():
if request.method == 'GET':
return make_response('failure')
if request.method == 'POST':
t_id = request.json['id']
t_name = request.json['name']
created_on = request.json['created_on']
modified_on = request.json['modified_on']
desc = request.json['desc']
create_row_data = {'id': str(t_id),'name':str(t_name),'created-on':str(created_on),'modified-on':str(modified_on),'desc':str(desc)}
response = requests.post(
url, data=json.dumps(create_row_data),
headers={'Content-Type': 'application/json'}
)
return response
Боролись с этим неделями. Что я делаю неправильно? Буду признателен за любую помощь.
2 ответа
Убедитесь, что вы используете правильный протокол. http
или же https
,
Если вы используете http
и увидеть редирект, редирект Location
заголовок обычно будет иметь правильный URL.
Хорошо, я проверил ваш сценарий локально и обнаружил две проблемы. Оба в вашем клиентском скрипте.
1) r = requests.post(url=api_url, data=create_row_data)
должно быть r = requests.post(url=api_url, json=create_row_data)
2) Ты ищешь created_on
а также modified_on
в вашем приложении Flask, но вы отправляете created-on
а также modified-on
,
Рабочий местный код ниже:
Клиент:
import json
import requests
api_url = 'http://localhost:5000/create-row-in-gs'
create_row_data = {'id': '1235','name':'Joel','created_on':'27/01/2018','modified_on':'27/01/2018','desc':'This is Joel!!'}
print(create_row_data)
r = requests.post(url=api_url, json=create_row_data)
print(r.status_code, r.reason, r.text)
Сервер:
from flask import Flask,jsonify,request,make_response,url_for,redirect
import requests, json
app = Flask(__name__)
url = 'https://hooks.zapier.com/hooks/catch/xxxxx/yyyyy/'
@app.route('/create-row-in-gs', methods=['GET','POST'])
def create_row_in_gs():
if request.method == 'GET':
return make_response('failure')
if request.method == 'POST':
t_id = request.json['id']
t_name = request.json['name']
created_on = request.json['created_on']
modified_on = request.json['modified_on']
desc = request.json['desc']
create_row_data = {'id': str(t_id),'name':str(t_name),'created-on':str(created_on),'modified-on':str(modified_on),'desc':str(desc)}
response = requests.post(
url, data=json.dumps(create_row_data),
headers={'Content-Type': 'application/json'}
)
return response.content
if __name__ == '__main__':
app.run(host='localhost',debug=False, use_reloader=True)