我在java中使用Restlet作为一个简单的客户端来调用由tastepie(python django)提供的RESTful服务
我正在通过 tcpmon 监控有效负载,我看到以下有效负载被返回,但是我无法获取有效负载中的数据。
客户来电
ClientResource resource = new ClientResource("http://localhost/someplace/");
String rep = resource.get(String.class);
有效载荷
HTTP/1.0 200 OK
Date: Thu, 12 Jul 2012 20:22:12 GMT
Server: WSGIServer/0.1 Python/2.7.1
Vary: Cookie
Content-Type: application/json; charset=utf-8
Set-Cookie: sessionid=63c5ea23113073e489cb8920819f37d; expires=Thu, 26-Jul-2012 20:22:12 GMT; httponly; Max-Age=1209600; Path=/
{"jsonData": "someData"}
当我调试到 restlet 时,我注意到 InboundWay.createEntity(..) 由于缺少长度、块编码或连接标头而将数据设置为 EmptyRepresentation。为什么是这样?为什么我不能只流式传输数据?
有谁知道为什么会这样?有更好的客户吗?到目前为止,尝试了球衣和 Resteasy 并取得了有限的成功。(jeresy 有一个错误,它试图标记和重置 autoCloseSteam,而 resteasy 只是作为客户端使用很痛苦)我希望不必编写 HTTPClient。
做了更多的挖掘,在我看来,RESTLET 正在做一些非常愚蠢的事情。
它正在查看响应标头并尝试查找它是否知道大小,或者是否知道它的 chunkedEncoding,或者是否指定了 Connection:closed。否则它不会尝试解析有效负载......有谁知道这是为什么?我没有意识到以任何方式都需要这些标题。为什么我们不能在未指定连接关闭时使用 ClosingInputStream...
Restlet 代码
public Representation createInboundEntity(Series<Parameter> headers) {
Representation result = null;
long contentLength = HeaderUtils.getContentLength(headers);
boolean chunkedEncoding = HeaderUtils.isChunkedEncoding(headers);
// In some cases there is an entity without a content-length header
boolean connectionClosed = HeaderUtils.isConnectionClose(headers);
// Create the representation
if ((contentLength != Representation.UNKNOWN_SIZE && contentLength != 0)
|| chunkedEncoding || connectionClosed) {
InputStream inboundEntityStream = getInboundEntityStream(
contentLength, chunkedEncoding);
ReadableByteChannel inboundEntityChannel = getInboundEntityChannel(
contentLength, chunkedEncoding);
...