以下是我正在处理的rest api的一些代码。我从找到的here教程中获得了这个。它正在工作,并使用以下curl命令,最终将添加一个部落。
curl -H "Content-Type: application/json" -X POST -d '{"data":[ {"group" : "Read a book"}] }' http://localhost:5000/group_es/api/v1.0/group
烧瓶应用程序本身的代码如下。
from flask import Flask, jsonify, abort, make_response, request
app = Flask(__name__)
groups = [
{
'id': 1,
'title': u'Buy groceries',
'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
'done': False
},
{
'id': 2,
'title': u'Learn Python',
'description': u'Need to find a good Python tutorial on the web',
'done': False
}
]
@app.route('/group_es/api/v1.0/group', methods=['GET'])
def get_tribes():
return jsonify({'group': groups})
@app.errorhandler(404)
def not_found(error):
return make_response(jsonify({'error': 'Not found'}), 404)
@app.route('/group_es/api/v1.0/group', methods=['POST'])
def create_group():
if not request.json or not 'data' in request.json:
abort(400)
groups = request.json['data']
return jsonify({'group': groups}), 20
@app.route('/group_es/api/v1.0/group', methods=['PUT'])
def update_group():
print 'REQUEST', request.json
groups = request.json['data']
return jsonify({'group': groups}), 20
无论如何,我试图使用请求库将curl命令转换为python请求:
import json
from requests import put, post, request
headers = {'content-type': 'application/json'}
In[6]: put('http://localhost:5000/group_es/api/v1.0/group', params={'data': [{'adam':'name'}] }, headers=headers)
Out[6]: <Response [400]>
然而,正如您所见,它失败了。我不知道这是否是由于烧瓶库本身造成的,也不是由于不正确的请求命令与卷曲不同步。
我还试图将标题作为字典传入,并使用json
转储数据resp = put('http://localhost:5000/tribe_es/api/v1.0/tribe', data=json.dumps({'data':'adam'}),headers={'content-type':'application/json'})
这会导致错误,我以前没见过:
ConnectionError: ('Connection aborted.', BadStatusLine('HTTP/1.0 20 UNKNOWN\r\n',))
如果有人可以帮助requests
无法正常工作,那么curl
工作正常会很好!
答案 0 :(得分:1)
您不是在这里发送JSON:
put('http://localhost:5000/group_es/api/v1.0/group', params={'data': [{'adam':'name'}] }, headers=headers)
params
会将数据编码为x-www-url编码的数据。请改用json
关键字; Content-Type标题将相应调整,因此您无需手动设置标题:
put('http://localhost:5000/group_es/api/v1.0/group', json={'data': [{'adam':'name'}] })
您的curl
命令行使用的是POST
,而不是PUT
,但您的PUT
处理程序也已损坏。状态实际上意味着您的代码工作,但您的PUT
处理程序返回状态20
,而不是200
:
return jsonify({'group': groups}), 20
删除, 20
; 200是返回的默认状态代码。或者像教程中那样使用201
;意思是创建而不是确定:
return jsonify({'group': groups}), 201
如果您使用了post()
,那么您已经看到data=json.dumps()
方法正常工作了。如果您使用curl -X PUT
,您可能已经看到了状态代码的相同问题。