2016-02-11 258 views
0

所以,我試圖創建一個簡單的(我的意思是簡單)POST請求。這是服務器端的類。POST請求到一個REST服務器

@Stateless 
@Path("cards") 
public class CardsFacadeREST extends AbstractFacade<Cards> { 

    @POST 
    @Path("test") 
    @Consumes({"text/plain"}) 
    public void createTestCard() { 
     Cards card = new Cards(); 
     card.setName("Test Card"); 

     super.create(card); 
    } 

    @GET 
    @Path("count") 
    @Produces("text/plain") 
    public String countREST() { 
     return String.valueOf(super.count()); 
    } 
} 

GET方法工作正常,但POST方法不適用於我。我正在使用Chrome的高級休息客戶端。

就是這樣。

我不斷收到「400:錯誤的請求,客戶端發送的請求在語法上不正確。」

當我打開的窗口JSON的響應,所有它說是「意外令牌<」

這裏是請求頭,如果有什麼差別。

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36 
Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo 
Content-Type: text/plain 
Accept: */* 
Accept-Encoding: gzip, deflate 
Accept-Language: en-US,en;q=0.8 
Cookie: JSESSIONID=f4c746a32b46244d422800192f04; treeForm_tree- hi=treeForm:tree:applications 

Body is empty. 

和響應:

X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition 4.0 Java/Oracle Corporation/1.7) 
Server: GlassFish Server Open Source Edition 4.0 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET, POST, PUT, DELETE 
Allow: GET,DELETE,OPTIONS,PUT,POST 
Access-Control-Allow-Headers: content-type 
Content-Language: 
Content-Type: text/html Date: Thu, 11 Feb 2016 20:48:12 GMT 
Connection: close Content-Length: 1105 

Body: 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>GlassFish Server Open Source Edition 4.0 - Error report</title><style type="text/css"><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 400 - Bad Request</h1><hr/><p><b>type</b> Status report</p><p><b>message</b>Bad Request</p><p><b>description</b>The request sent by the client was syntactically incorrect.</p><hr/><h3>GlassFish Server Open Source Edition 4.0 </h3></body></html> 
+0

您可以發佈您正在使用的客戶端的請求和響應數據嗎?整個事情。網址,動詞,請求和響應主體,標題,作品。 –

+0

有點麻煩,但我認爲它全部在那裏。 – exxodus7

+0

Man,這個API似乎並不能幫助你弄清楚爲什麼你會得到這個錯誤。我可以告訴你,你得到的「Unexpected token <」錯誤是因爲Json序列化程序期待JSON,並且它正在獲取HTML(xml)。它會拋出該異常,因爲它會在響應中看到的起始字符是「<」而不是「{」或「[」。現在我不知道它爲什麼會返回一個400.你可以嘗試以下方法:確保設置了content-length,確保accept和content-type設置爲application/json(我假設服務器以JSON表示) –

回答

2

400錯誤的請求響應可能是因爲服務器已經表示,它預計特定內容類型

@Consumes({"text/plain"} 

但是客戶端不表明帖子主體是這種類型的。

爲了解決這個問題,請確保您的客戶端的POST請求包含以下HTTP標頭:

的Content-Type:text/plain的

或者,也許它的情況是,你不是發佈純文本,你打算髮布XML或JSON。無論打算什麼類型,您只需確保客戶端和服務器就此達成一致。

+0

Both @Consumes和Content-Type表示text/plain。身體裏沒有任何東西。也許這是一個問題,沒有什麼在身體? – exxodus7

+0

可能。它通常被認爲是沒有身體的POST形式。事實上,我已經看到網絡防火牆規則阻止這種類型的請求作爲潛在的安全問題。 – EJK

+0

錯誤的另一個解釋是客戶端聲稱有效載荷包含文本,但有效載荷中沒有文本。聽起來像一個壞的請求給我.....所以我建議嘗試其他的東西,只是爲了得到這個工作,將刪除@Consumes註釋(這是可選的),並省略內容類型的頭該請求(也是可選的)。 – EJK

0

如果HTTP請求具有正文,則它必須具有Content-Length或Transfer-Encoding標頭。

既沒有,請求也沒有主體 - 甚至沒有長度爲0的主體。如果你想發送一個空的主體,請求應該有標題Content-Length: 0

沒有身體和有空身體之間有語義上的區別。服務器顯然拒絕沒有正文的POST請求。 (雖然請求實際上是有效根據RFC語法


其實,這部分不是很清楚(discussion thread(不讀))。還有一些實現爲GET請求設置了Content-Length: 0;一些實現爲空的POST主體省略了Content-Length: 0;兩者都是錯誤的......有時他們有時候並不工作。歡迎來到HTTP的混沌世界。

0

我討厭它發生這種情況。這完全是另一回事,我的持久性bean弄糟了。當我在我的POST方法中註釋掉「super.create(card)」時,一切正常(請求正文或不正確)。

仍然不知道爲什麼會導致「400:錯誤的請求。客戶端發送的請求在語法上不正確。」

好像我有另一個問題要弄清楚,但至少這個問題已經解決了。

謝謝你們的幫助!