Форум сайта python.su
А я все учу сетевое программирование на питоне, но так и не понял как составлять http запросы.
Написал такую функцию:
def co(): conn = httplib.HTTPConnection("127.0.0.1", 5000) conn.request("POST", "/api/post/", "Content-type: application/json", '{"title":"zagolovok", "desc": "opisanie"}') response = conn.getresponse() data = response.read() conn.close() return data
curl -i -H "Content-Type: application/json" -X POST -d '{"title":"Zagolovok", "desc": "opisanie"}' http://localhost:5000/api/post/
@app.route('/api/post/', methods=['GET', 'POST']) def post(): if request.method == 'POST': print request.json['title'] print request.json['desc'] return jsonify({'error': 0}) return ""
Отредактировано librako (Июль 7, 2013 18:14:47)
Офлайн
Может покажешь что за ошибки у тебя ? Возможно у тебя код фласка неверный
Офлайн
/usr/bin/python2.7 /home/user/djcode/web_api/X_api_test.py Traceback (most recent call last): File "/home/user/djcode/web_api/X_api_test.py", line 25, in <module> co() File "/home/user/djcode/web_api/X_api_test.py", line 5, in co conn.request("POST", "/api/post/", "Content-type: application/json", '{"title":"zagolovok", "desc": "opisanie"}') File "/usr/lib/python2.7/httplib.py", line 962, in request self._send_request(method, url, body, headers) File "/usr/lib/python2.7/httplib.py", line 994, in _send_request for hdr, value in headers.iteritems(): AttributeError: 'str' object has no attribute 'iteritems' Process finished with exit code 1
Офлайн
Параметр header - это не строка, как у вас.
http://docs.python.org/release/2.5.2/lib/httplib-examples.html
Офлайн
так
params = urllib.urlencode({"title":"zagolovok", "desc": "opisanie"}) headers = {"Content-type": "application/json", "Accept": "text/plain"} conn = httplib.HTTPConnection("127.0.0.1", 5000) conn.request("POST", "/api/v1.0/create_user", params, headers) response = conn.getresponse() print response.status, response.reason data = response.read() conn.close()
Офлайн
Похоже, у вас не настроен сервер на обработку входящих application/json или вы передаете не json.
Отсюда возникает следующий вопрос:
зачем вам передавать данные в json, если сервер не умеет/не настроен это делать?
Почему вы не передаете данные как application/x-www-form-urlencoded, хотя используете urllib.urlencode, у вас в params совсем не серириализованный json после применения urlencode.
Попробуйте параметры оставить как было.
Приведенный по ссылке пример, как было сказано, касался только headers, а вы почему то поменяли код полностью, не понимая что он там делает.
Кстати, почему во втором вашем примере изменился URL?
Офлайн
librakoТакже как и в csv, html, xml и т.д.
Как мне передать данные в json'е?
params = '{"title":"zagolovok", "desc": "opisanie"}'
Отредактировано plusplus (Июль 8, 2013 13:43:34)
Офлайн
Lexander, я не понимал как это работает и должно работать, поэтому вносил изменения в код интуитивно по примерам. Сервер принимает json вполне нормально, ведь если посылать данные с терминала, то все работает как нужно
curl -i -H "Content-Type: application/json" -X POST -d '{"title":"Zagolovok", "desc": "opisanie"}' http://localhost:5000/api/post/
Отредактировано librako (Июль 8, 2013 13:55:47)
Офлайн