Найти - Пользователи
Полная версия: отправка POST
Начало » Network » отправка POST
1
librako
А я все учу сетевое программирование на питоне, но так и не понял как составлять 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 ""

Подскажите, пожалуйста, что я делаю не так
Singularity
Может покажешь что за ошибки у тебя ? Возможно у тебя код фласка неверный
librako
/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()
Lexander
Параметр header - это не строка, как у вас.
http://docs.python.org/release/2.5.2/lib/httplib-examples.html
librako
так
    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'е?
Lexander
Похоже, у вас не настроен сервер на обработку входящих application/json или вы передаете не json.
Отсюда возникает следующий вопрос:
зачем вам передавать данные в json, если сервер не умеет/не настроен это делать?
Почему вы не передаете данные как application/x-www-form-urlencoded, хотя используете urllib.urlencode, у вас в params совсем не серириализованный json после применения urlencode.

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

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

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

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

Вариант от plusplus работает как нужно, спасибо.
Всем спасибо за помощь, проблема решена, с httplib немного разобрался
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB