2011-02-26 55 views
1

我無法正確格式化我的PUT請求,以使我的服務器識別我的客戶端應用程序的PUT命令。將JSON對象放入REST風格服務器的正確方法

這是我的一段代碼,將JSON字符串放到服務器上。

try { 
    URI uri = new URI("the server address goes here"); 
    URL url = uri.toURL(); 
    URLConnection conn = url.openConnection(); 
    conn.setDoOutput(true); 
    OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream()); 
    out.write(gson.toJson(newClient)); 
    out.close(); 
} catch (Exception e) { 
    Logger.getLogger(CATHomeMain.class.getName()).log(Level.SEVERE, null, e); 
} 

,這裏是一個應該抓住PUT命令

@PUT 
@Consumes("text/plain") 
public void postAddClient(String content, @PathParam("var1") String var1, @PathParam("var2") String var2) { 

我在做什麼錯誤的代碼?

回答

5

您還需要告訴客戶端它正在執行JSON的PUT。否則,它會嘗試發佈未知類型的東西(詳細的服務器日誌可能會記錄它的失敗),這完全不是你想要的。 (處理省略例外。)

URI uri = new URI("the server address goes here"); 
HttpURLConnection conn = (HttpURLConnection) uri.toURL().openConnection(); 
conn.setDoOutput(true); 
conn.setRequestMethod("PUT"); 
conn.addRequestProperty("Content-Type", "application/json"); 
OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream()); 
out.write(gson.toJson(newClient)); 
out.close(); 
// Check here that you succeeded! 

在服務器端,你希望這樣的聲明,這當然@Consumes("application/json"),你可能想的方法要麼返回結果的表示或重定向到它(見this SO question對於這些問題的討論),所以你的方法的結果不應該是void,而是值類型或JAX-RS Response(這是如何做重定向)。

+0

這是一個錯誤的MIME類型和conn.setRequestMethod(「PUT」)的組合; – 2011-02-27 09:59:36

3

可能是MIME類型。嘗試「application/json」。

+0

'application/json'是[官方正確的MIME類型](http://stackoverflow.com/questions/477816/the-right-json-content-type/477819#477819)。 – MatrixFrog 2011-02-26 21:24:23

+0

這就是我不查找它所得到的。謝謝。 – 2011-02-27 07:43:44

+0

你還需要設置connectionconn.setRequestMethod(「PUT」); – 2011-02-27 13:03:32