Django-Piston与Python客户端和Java客户端对比
我用Django-Piston搭建了一个网络服务,可以处理POST和GET请求。在测试的时候,我写了一个简单的Python脚本。通过这个脚本,我可以成功发送这两种请求;但是,当一个用Java写的客户端尝试发送POST请求时,我收到了一个错误:“POST /api/service/ HTTP/1.1” 400 225 "-" "Apache-HttpClient/4.1 (java 1.5)"。
我的理解是,不管用什么语言生成的HTTP请求消息都应该是一样的。换句话说,如果我用Python客户端测试我的网络服务并且成功了,那么其他任何有HTTP库的语言也应该能成功。
这是我用来发送POST请求的Python代码:
import urllib, urllib2
data = urllib.urlencode({'url': 'www.uvic.ca', 'name': 'uvic'})
url = 'http://xxx/api/service/'
req = urllib2.Request(url, data)
print urllib2.urlopen(req).read()
这是我用的Java代码:
HttpPost httpost = new HttpPost("http://xxx/api/service/");
List <NameValuePair> nvps = new ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair("name", "some_name"));
nvps.add(new BasicNameValuePair("url", "www.somename.com"));
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
response = httpclient.execute(httpost);
entity = response.getEntity();
System.out.println(entity.getContentType());
System.out.println(EntityUtils.getContentCharSet(entity));
System.out.println(EntityUtils.toString(entity));
我开始觉得这可能是Apache的配置问题。我在POST方法的开头加了一些调试语句,但根本没有触发它们。这意味着urls.py文件可能有问题(我不太相信,因为在Python中可以正常工作),或者Apache的配置有点奇怪。
请帮帮我。提前谢谢!
1 个回答
稍微搜索一下会对你有很大帮助。这是谷歌的第一个搜索结果。
http://weblog.mattdorn.com/content/restful-web-apps-with-django-piston-and-ext-js/
出现400错误的原因是因为 ExtJS在内容类型(Content-Type)字段后面加了一个字符集(charset),这导致 piston无法正确解析 内容类型。这个问题在 http://bitbucket.org/jespern/django-piston/issue/121/content-type-is-not-being-split-against 上有一个开放的问题。我在应用了补丁并进行了简单安装后,成功让示例运行起来了。
这是谷歌的第二个搜索结果。
https://bitbucket.org/jespern/django-piston/issue/99/bad-request-and-content-type-with-fix