无法使用urllib2将content-type设置为application/json

dan*_*ast 13 python post json urllib2

这个小宝贝:

import urllib2
import simplejson as json

opener = urllib2.build_opener()
opener.addheaders.append(('Content-Type', 'application/json'))
response = opener.open('http://localhost:8000',json.dumps({'a': 'b'}))
Run Code Online (Sandbox Code Playgroud)

产生以下请求(如ngrep所示):

sudo ngrep -q -d lo '^POST .* localhost:8000'

T 127.0.0.1:51668 -> 127.0.0.1:8000 [AP]
  POST / HTTP/1.1..Accept-Encoding: identity..Content-Length: 10..Host: localhost:8000..Content-Type: application/x-www-form-urlencoded..Connection: close..User-Agent:
   Python-urllib/2.7....{"a": "b"} 
Run Code Online (Sandbox Code Playgroud)

我不希望这样Content-Type: application/x-www-form-urlencoded.我明确地说我想要('Content-Type', 'application/json')

这里发生了什么?!

mat*_*ata 16

如果要设置自定义标头,则应使用Request对象:

import urllib2
import simplejson as json

opener = urllib2.build_opener()
req = urllib2.Request('http://localhost:8000', data=json.dumps({'a': 'b'}),
      headers={'Content-Type': 'application/json'})
response = opener.open(req)
Run Code Online (Sandbox Code Playgroud)

  • 如果没有添加相应的标题,则只添加"addheaders"中的标题,但如果使用`data`参数,则内容类型已隐式设置为默认值(x-www-form-urlencoded).在这种情况下,这优先于`addheaders`中的标题. (2认同)