使用 postman ,拼装好数据后采用 raw+application/json 的格式,发送 Post 请求能够被服务器正常接收。 通过截包工具 charles 工具,看到发出去的请求是 application/json 格式的数据。
但是采用 python3+urllib ,设置好 http 请求头的 contentType 为 application/json 格式以后,将参数通过 json.dumps 转换为 str 再 encode 成 bytes ,然后通过 openner 对象访问一个连接后,通过截包工具 charles 发现发出去的请求实际上是 application/x-www-form-urlencoded 的格式,请求虽然能成功但是服务器无法解析。
不太清楚这里内部处理是怎么一回事,不过尝试了很多方法, urllib 的包里我也没有看到能够直接把 dict 格式的数据作为参数的 api 。 postdata 都需要 bytes 格式的数据才行。
我的代码大概如下:
head = {
'Accept': '*/*',
'Host': 'www.lvtufang.com',
'Connection': 'keep-alive',
'Content-Length': '245',
'Origin': 'http://www.lvtufang.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome'
'/51.0.2704.103 Safari/537.36',
'Content-Type': 'application/json',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Referer': 'http://www.lvtufang.com/Account/Login?ReturnUrl=%2FHotel%2FFind',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Accept-Encoding': 'gzip, deflate'
}
cookie = cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
opener.addheader(head)
# 其他为了获取 cookie 的各种请求。
.....
.....
.....
parsed_request_data = json.dumps(self.hotel_search_request_data).encode()
response = openner.open(self.hotel_search_url, parsed_request_data)
不知道是否有经验的同学能不能帮一下忙。谢谢!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.