I'm trying to make a put request using a tornado ASyncHTTPClient like so:
data = { 'text': 'important text',
'timestamp': 'an iso timestamp' }
request = tornado.httpclient.HTTPRequest(URL, method = 'PUT', body = urllib.urlencode(data))
response = yield Task(tornado.httpclient.ASyncHTTPClient().fetch, request)
However, when the request hits its desired endpoint, it appears not to have a body, despite said body being properly encoded and defined above. Is there something that I'm overlooking here?
If the other end is expecting JSON, you probably need to set a "Content-Type" header. Try this:
data = { 'text': 'important text',
'timestamp': 'an iso timestamp' }
headers = {'Content-Type': 'application/json; charset=UTF-8'}
request = tornado.httpclient.HTTPRequest(URL, method = 'PUT', headers = headers, body = simplejson.dumps(data))
response = yield Task(tornado.httpclient.ASyncHTTPClient().fetch, request)
This way, the header tells the server you're sending JSON, and the body is a string that can be parsed as JSON.
The issue is probably on the other end.
The following test using Tornado 2.4.1 yields the expected output.
import logging
import urllib
from tornado.ioloop import IOLoop
from tornado.web import Application, RequestHandler, asynchronous
from tornado.httpclient import HTTPRequest, AsyncHTTPClient
from tornado import gen, options
log = logging.getLogger()
options.parse_command_line()
class PutBodyTest(RequestHandler):
@asynchronous
@gen.engine
def get(self):
data = {
'text': 'important text',
'timestamp': 'a timestamp'
}
req = HTTPRequest(
'http://localhost:8888/put_body_test',
method='PUT',
body=urllib.urlencode(data)
)
res = yield gen.Task(AsyncHTTPClient().fetch, req)
self.finish()
def put(self):
log.debug(self.request.body)
application = Application([
(r"/put_body_test", PutBodyTest),
])
if __name__ == "__main__":
application.listen(8888)
IOLoop.instance().start()
Log output:
$ python put_test.py --logging=debug
[D 130322 11:45:24 put_test:30] text=important+text×tamp=a+timestamp
[I 130322 11:45:24 web:1462] 200 PUT /put_body_test (127.0.0.1) 0.37ms
[I 130322 11:45:24 web:1462] 200 GET /put_body_test (::1) 9.76ms
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With