2016-02-13 82 views
1

我正在用Restlet構建某種代理服務器,但是我遇到了一個問題,那就是根據客戶端請求沒有自動確定MediaType的方法。如何從請求中獲取MediaType

這裏是我的代碼:

Representation entity = null; 
entity.setMediaType(processMediaType(path)); 

處理媒體類型:

private MediaType processMediaType(String path){ 
    MediaType type = MediaType.ALL; 
    if(path.endsWith("html")){ 
     type = MediaType.TEXT_HTML; 
    } else if (path.endsWith("css")) { 
     type = MediaType.TEXT_CSS; 
    } else if (path.endsWith("js")) { 
     type = MediaType.TEXT_JAVASCRIPT; 
    } else if (path.endsWith("txt")) { 
     type = MediaType.TEXT_PLAIN; 
    } else if (path.endsWith("jpg")){ 
     type = MediaType.IMAGE_JPEG; 
    } else if (path.endsWith("png")){ 
     type = MediaType.IMAGE_PNG; 
    } 
    return type; 
} 

我想知道如果的MediaType可以通過框架(或從該請求獲得的MediaType自動構造,這對我來說不起作用),因此我不需要執行這些if-else語句,這些語句在捕捉各種媒體類型方面非常有限。

回答

0

Restlet根據Content-Type標題獲取請求的媒體類型。要將值,您可以使用此:

MediaType mediaType = getRequest().getEntity().getMediaType(); 

的ClientInfo客戶端的媒體類型提示對應於什麼是Accept頭中提供:

getRequest().getClientInfo().getAcceptedMediaTypes(); 

要獲得的Restlet API的報頭的映射,你可以看看這個鏈接:

1

爲什麼你需要確定媒體類型?通常,當您構建在Java中的REST API創建的,即允許每個媒體類型的單個方法,

@Path("<your_path>") 
@Consumes (MediaType.XML) 
@Produces (MediaType.XML) 
public Response processXMLRequest (...){ 
    //a more general method to process all request 
    return processRequest (request, MediaType.XML); 
} 


@Path("<your_path>") 
@Consumes (MediaType.JSON) 
@Produces (MediaType.JSON) 
public Response processXMLRequest (...){ 
    //a more general method to process all request 
    return processRequest (request, MediaType.JSON); 
} 

等等

1

如果你需要這個信息可以在ClientInfo對象 內請求。使用Restlet用於進行內容協商的相同機制,Em Ae的答案也是自動完成的。

例如,ServerResource類函數中:你在哪裏最適用的方式提供支持MediaTypes列表

List<MediaType> supported = null; 
    MediaType type = getRequest().getClientInfo().getPreferredMediaType(supported); 

+0

這就像'getPreferredMediaType(null);'? – xybrek

+0

@xybrek此刻是我離開提供您所支持的'MediaType'列表,因爲您可能希望對其進行硬編碼,從靜態常量或其他方式獲取它,最簡單的解決方案是'Arrays .asList(MediaType.TEXT_HTML,MediaType.TEXT_CSS,...等);'但是我沒有足夠的上下文來提示這是正確的。基本上用你所支持的類型列表替換上面的'null'。 – Caleryn