我正在创建一个SublimeText 2插件,该插件将数据发布到我运行的服务器。我在火车上用我的手机作为WiFi热点写了基本的东西,一切都很好。然后,当我回到家,我得到了一个400坏请求响应从我的服务器无论我试图张贴。我把笔记本电脑放回个人热点上,错误就消失了。以下是详细信息:
这里的"客户端"是Sublime Text 2。如果你还不知道,他们的插件是用Python编写的,我使用urllib, urllib2和httplib来处理请求。以下是发出请求的相关Python代码:
params = urllib.urlencode({'title': 'ST2 Note', 'content': data, 'user': user, 'pass': pswd})
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
conn = httplib.HTTPConnection("staging.myserver.me:80")
conn.request("POST", "staging.myserver.me/st2", params, headers)
response = conn.getresponse()
data2 = response.read()
print data2
conn.close()
上面的代码可以很好地发送POST请求。如果我在某个连接上,我的服务器肯定能理解它,因为我将它设置为只回显我在POST数据中发送的内容。请求是向PHP (Codeigniter)应用程序的一部分发出的,是的,我已经特别设置了它,以便对这个特定的URL关闭CSRF保护,所以我知道这不是问题。PHP代码本身相当无趣,但我将其设置为回显服务器标头,这是当我从连接发出请求时发送的内容:
Host: staging.myserver.me
Accept-Encoding: identity
Content-Length: 56
Content-type: application/x-www-form-urlencoded
Accept: text/plain
Via: HTTP/1.1 akrmspsrvz9ts212.wnsnet.attws.com
你知道为什么服务器可以理解来自某些连接的请求而不是其他连接的请求吗?
看起来我让它工作了。我知道还有其他人和我有同样的问题,所以事情是这样的……
由于我是一个Python/HTTP1.1新手而无法理解的原因,没有"http://"的计划主机名在某些时候是有效的。肯定和互联网服务提供商以及他们如何路由流量有关,不确定。所以修复方法是修改这一行:
conn.request("POST", "staging.myserver.me/st2", params, headers)
上面的行导致了问题。但是改成这样:
conn.request("POST", "http://staging.myserver.me/st2", params, headers)
让它立即工作!我希望这对将来的人有所帮助。有时400个错误几乎和500个错误一样神秘。