使用restlet

时间:2016-02-16 17:42:47

标签: google-chrome restlet

我刚开始使用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(); 
    } 
} 

当我尝试通过点击http://localhost:8989/在Chrome中运行代码时出现以下错误: enter image description here

当我将资源返回值包含在像<tag>Hello World</tag>这样的xml标记中时,此错误消失了,并且默认XML模板显示在Chrome中,标记中包含“Hello World”。

使用ClientResource变量通过代码访问资源,没有标记就可以正常工作。

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

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

感谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

  • Content-Type:请求或响应的文本有效内容的格式。在您的情况下,此标头告诉客户端您返回的数据的结构。
  • Accept:您在响应中预期的文本有效内容的格式。此标头在请求中使用,并由浏览器根据其支持的内容自动设置。服务器负责考虑此标头以返回支持的内容。

有关详细信息,请参阅此文章:

Restlet提供开箱即用的内容协商。我的意思是您返回一个文字,它会自动在Content-Type的回复中设置text/plain标题:

@Get 
public String represent(){ 
  return "Hello World"; 
}

如果您想要返回其他内容类型,您可以完全掌握。这是一个示例:

@Get 
public Representation represent() { 
  return new StringRepresentation(
     "<tag>Hello World</tag>",
     MediaType.APPLICATION_XML); 
}

您还可以在@Get级别定义参数,以考虑提供的Accept标题:

@Get('xml')
public Representation represent() { 
  return new StringRepresentation(
     "<tag>Hello World</tag>",
     MediaType.APPLICATION_XML); 
}

@Get('json')
public Representation represent() { 
  return new StringRepresentation(
     "{ \"message\": \"Hello World\" }",
     MediaType.APPLICATION_JSON); 
}

// By default - if nothing matches above
@Get
public Representation represent() { 
  return new StringRepresentation(
     "Hello World",
     MediaType.PLAIN_TEXT); 
}

另一件事是Restlet允许直接在服务器资源方法级别而不是StringRepresentation上利用bean。这对应于转换器功能。要使用它,您需要注册转换器。例如,只需从Restlet的Jackson扩展中添加jar文件(带有依赖项的org.restlet.ext.jackson)。基于Jackson的转换器将自动注册。这样文本有效负载将转换为bean和bean转换为文本。

现在你可以使用类似的东西:

@Get('json')
public Message represent() { 
  Message message = new Message();
  message.setMessage("Hello world");
  return message; 
}

基于您创建的Message课程:

public class Message {
  private String message;

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