0

对于公开资源“/hello”的类:

@Path("/hello")
public class Test {


    //-- produces MIME type text/plain
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public  String thankYouTxt(){
        System.out.println("thankYouTxt");

        return "thankYouTxt\n";
    }

    //-- consumes MIME type text/plain
    @GET
    @Consumes(MediaType.TEXT_PLAIN)
    public String thankYouInputTxt(){
        System.out.println("thankYouInputTxt");
        return "thankYouInputTxt";

    }


    //-- produces MIME type text/html
    @GET
    @Produces(MediaType.TEXT_HTML)
    public  String thankYouHTML(){
        System.out.println("thankYouHTML"); 
        return "thankYouTxtHTML";
    }


    //-- consumes MIME type text/html
    @GET
    @Consumes(MediaType.TEXT_HTML)
    public  void thankYouInputHTML(){
        System.out.println("thankYouInputHTML");
        //return "thankYouInputHTML";
    }



    //-- produces MIME type text/xml 
    @GET
    @Produces(MediaType.TEXT_XML)
    public  String thankYouXML(){
        System.out.println("thankYouXml");
        return "<?xml version=\"1.0\"?> <message>thankYouTxt</message>";
    }
    //-- consumes MIME type text/xml    
    @GET
    @Consumes(MediaType.TEXT_XML)
    public String thankYouInputXML(){
        System.out.println("thankYouInputXML");
        return "thankYouInputXML";
    }



}

Api 文档上,他们声明了 MIME 接受订单:

如果资源类能够生成一种以上的 MIME 媒体类型,则选择的资源方法将对应于客户端声明的最可接受的媒体类型。更具体地说,HTTP 请求的 Accept 标头声明了最可接受的内容。例如,如果 Accept 标头是 Accept: text/plain,则将调用 doGetAsPlainText 方法。或者,如果 Accept 头是 Accept: text/plain;q=0.9, text/html,它声明客户端可以接受 text/plain 和 text/html 的媒体类型,但更喜欢后者,则将调用 doGetAsHtml 方法.

谁/什么决定使用哪种 MIME 类型 (text/html) 而不是另一种 (text/html) ?

4

1 回答 1

1

好的,改写文档,因为似乎存在误解:

选择的资源方法将对应于客户端声明的最可接受的媒体类型

接着:

HTTP 请求的 Accept 标头声明 [s] 什么是最可接受的

此标头具有以下形式:

Accept: media/type1[;q=pref], media/type2[;q=pref], etc etc

q未提及时为 1.0 。

如果您有一个带有产生方法的请求,例如,foo/barand tar/feathers,如果 accept 标头声明第一个接受 1 而第二个接受 0,那么产生的方法foo/bar将运行。另一方面,如果第一个接受度为 0.5,而第二个接受度为 0.6,那么……你明白了。

至于如果没有真正首选的类型会发生什么,文档甚至没有说。但是,客户应该首先决定自己。

于 2013-06-17T13:41:10.673 回答