Google chrome 使用restlet在Chrome中返回get响应时出现文档为空错误

Google chrome 使用restlet在Chrome中返回get响应时出现文档为空错误,google-chrome,restlet,Google Chrome,Restlet,我刚刚开始使用restlet框架。 我已经编写了简单的服务器和资源类来开始。代码如下: 资源: import org.restlet.resource.Get; import org.restlet.resource.ServerResource; public class HelloWorldResource extends ServerResource { @Get public String represent(){ return "He

我刚刚开始使用restlet框架。 我已经编写了简单的服务器和资源类来开始。代码如下:

资源:

import org.restlet.resource.Get; 
import org.restlet.resource.ServerResource; 

public class HelloWorldResource extends ServerResource { 
    @Get 
    public String represent(){ 
            return "Hello World"; 
    } 
}
服务器:

import org.restlet.Server; 
import org.restlet.data.Protocol; 

public class HelloWorldServer { 
    public static void main(String[] args) throws Exception { 
            Server server = new Server(Protocol.HTTP, 8989, HelloWorldResource.class); 
            server.start(); 
    } 
} 
当我试图通过点击在Chrome中运行代码时,我得到以下错误:

当我将资源返回值括在xml标记中(如so
Hello World
)时,这个错误就消失了,默认的xml模板显示在Chrome中,标记中带有“Hello World”

使用ClientResource变量通过代码访问资源在没有标记的情况下工作得很好

此外,当在IE中运行相同的代码时,它会自动将带有消息的JSON文件下载到我的计算机

这种行为背后的原因是什么


谢谢。

服务器返回一个XML文档,这被认为是格式不正确的。您需要在其中包含根元素,而不是纯文本

事实上,您的问题与HTTP(Conneg)的内容协商功能有关。这利用了两个标题:

  • 内容类型
    :请求或响应的文本有效负载的格式。在您的情况下,这个头告诉客户端您返回的数据的结构
  • Accept
    :响应中预期的文本有效负载的格式。此标头在请求中使用,并由浏览器根据其支持的内容自动设置。服务器负责考虑此标头以返回支持的内容
有关更多详细信息,请参阅本文:

  • 了解HTTP内容协商:
Restlet提供了开箱即用的内容协商。我的意思是,如果您返回一条文本,它将在响应
text/plain
时自动设置
Content Type
标题:

@Get 
public String represent(){ 
  return "Hello World"; 
}
如果您想返回另一种内容类型,您完全可以进行操作。以下是一个示例:

@Get 
public Representation represent() { 
  return new StringRepresentation(
     "<tag>Hello World</tag>",
     MediaType.APPLICATION_XML); 
}
另一件事是,Restlet允许在服务器资源方法级别直接利用bean,而不是
String
Representation
。这与转换器功能相对应。要使用它,您需要注册一个转换器。例如,只需从restlet的jackson扩展中添加jar文件(org.restlet.ext.jackson with dependencies)。基于Jackson的转换器将自动注册。这样,文本负载将被转换为bean和bean到文本

现在,您将能够使用类似的内容:

@Get('json')
public Message represent() { 
  Message message = new Message();
  message.setMessage("Hello world");
  return message; 
}
基于您创建的
消息
类:

public class Message {
  private String message;

  public String getMessage() { return this.message; }
  public void setMessage(String message) { this.message = message; }
}

但是为什么相同的代码在chrome中返回XML,在IE中返回JSON?您需要检查chrome和IE请求中的
Accept
HTTP头。我相信Restlet依赖于它提供的MIME类型来确定响应内容类型;q=0.9,图像/webp,*/*;q=0.8,IE有
Accept:text/html、application/xhtml+xml、*/*
。两者都列出了xml,但chrome中的响应类型显示为xml,IE中的响应类型显示为JSON。您的想法?在我看来,Restlet只知道
application/xml
(但不知道
application/xhtml+xml
),因此它决定提供
application/xml
(即JSON)之后的下一种可用格式,正如IE[隐式]所说的,它不会接受
application/xml
。确实如此,但考虑到您的输入,我认为在Restlet中,JSON格式比XML格式具有更高的优先级。
public class Message {
  private String message;

  public String getMessage() { return this.message; }
  public void setMessage(String message) { this.message = message; }
}