Уведомления

Группа в Telegram: @pythonsu

#1 Июль 7, 2013 18:13:59

librako
Зарегистрирован: 2013-07-03
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

отправка POST

А я все учу сетевое программирование на питоне, но так и не понял как составлять 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/

Функция на flask, которая принимает данные, имеет следующий вид:
@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)

Офлайн

#2 Июль 7, 2013 18:53:59

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

отправка POST

Может покажешь что за ошибки у тебя ? Возможно у тебя код фласка неверный

Офлайн

#3 Июль 7, 2013 19:01:13

librako
Зарегистрирован: 2013-07-03
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

отправка POST

/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

С фласком все в порядке должно быть, я в нем почти уверен. Проблема явно с функцией co()

Офлайн

#4 Июль 8, 2013 00:02:45

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

отправка POST

Параметр header - это не строка, как у вас.
http://docs.python.org/release/2.5.2/lib/httplib-examples.html



Офлайн

#5 Июль 8, 2013 12:18:32

librako
Зарегистрирован: 2013-07-03
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

отправка POST

так

    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()
я получаю 400 Bad Request. Как мне передать данные в json'е?

Офлайн

#6 Июль 8, 2013 13:40:50

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

отправка POST

Похоже, у вас не настроен сервер на обработку входящих application/json или вы передаете не json.
Отсюда возникает следующий вопрос:
зачем вам передавать данные в json, если сервер не умеет/не настроен это делать?
Почему вы не передаете данные как application/x-www-form-urlencoded, хотя используете urllib.urlencode, у вас в params совсем не серириализованный json после применения urlencode.

Попробуйте параметры оставить как было.
Приведенный по ссылке пример, как было сказано, касался только headers, а вы почему то поменяли код полностью, не понимая что он там делает.

Кстати, почему во втором вашем примере изменился URL?



Офлайн

#7 Июль 8, 2013 13:42:43

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

отправка POST

librako
Как мне передать данные в json'е?
Также как и в csv, html, xml и т.д.

params = '{"title":"zagolovok", "desc": "opisanie"}'



Отредактировано plusplus (Июль 8, 2013 13:43:34)

Офлайн

#8 Июль 8, 2013 13:55:16

librako
Зарегистрирован: 2013-07-03
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

отправка POST

Lexander, я не понимал как это работает и должно работать, поэтому вносил изменения в код интуитивно по примерам. Сервер принимает json вполне нормально, ведь если посылать данные с терминала, то все работает как нужно

curl -i -H "Content-Type: application/json" -X POST -d '{"title":"Zagolovok", "desc": "opisanie"}' http://localhost:5000/api/post/
Когда я создавал тему, то немного подправил урлы и названия функций для большей наглядности, а потом уже забыл это сделать.

Вариант от plusplus работает как нужно, спасибо.
Всем спасибо за помощь, проблема решена, с httplib немного разобрался

Отредактировано librako (Июль 8, 2013 13:55:47)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version