问题

在用Python模拟浏览器请求时遇到的问题。

主要是在模拟这个ajax请求:

$.ajax({
    type: "post",
    url: "/PointExchangeRoom/IsAnom",
    datatype: "json",
    async: false,
    success: function (data) {
        ...
    }
});

正常情况下就是发送一个不带data的POST请求,比如:

import urllib.request

s = urllib.request.Request(url=url, headers=headers, method='POST')
con = urllib.request.urlopen(s)

但竟然意外得到的是411错误,真是从来没见过。

解决方法

Google了一下发现可能是服务器端没有找到headers中Content-Lengh这项,导致报错HTTP Error 411 – Length required。

然后尝试发送空data,即:

import urllib.request
import urllib.parse

s = urllib.request.Request(url=url, data=urllib.parse.urlencode(
    '').encode(), headers=headers, method='POST')
con = urllib.request.urlopen(s)

然后就一切都正常了。

奇怪为何ajax请求不包含data就没问题,urllib中不包含data就会报错。