POST请求到REST服务器

时间:2016-02-11 20:52:44

标签: java rest

所以,我试图创建一个简单的(我的意思是简单的)POST请求。这是服务器端的类。

@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的高级休息客户端。

就是这样。

我一直得到一个&#34; 400:错误的请求。客户端发送的请求在语法上是不正确的。&#34;

当我在JSON窗口中打开响应时,它所说的只是&#34;意外的标记&lt;&#34;

以下是请求标头,如果这有任何区别。

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>

3 个答案:

答案 0 :(得分:2)

400-Bad请求响应可能是因为服务器已表示它需要特定的内容类型

@Consumes({"text/plain"}

但是,客户端并未表明帖子正文属于此类型。

要解决此问题,请确保来自客户端的POST请求包含以下HTTP标头:

  

Content-Type:text / plain

或者,也许是你没有POST纯文本而你打算POST XML或JSON的情况。无论预期的类型是什么,您只需确保客户端和服务器就此达成一致。

答案 1 :(得分:0)

如果HTTP请求具有正文,则它必须具有Content-Length或Transfer-Encoding标头。

两者都没有,请求没有正文 - 甚至没有长度为0的正文。如果你想发送一个空体,请求应该有标题Content-Length: 0

没有身体和空身之间存在语义差异。服务器显然拒绝没有正文的POST请求。 (虽然请求实际上语法根据RFC有效)

实际上,这部分不太清楚(discussion thread(不读))。并且一些实现为Content-Length: 0请求设置了GET;一些实现为空POST主体省略了Content-Length: 0;两者都错了......有时候他们工作有时他们没有。欢迎来到HTTP的混乱世界。

答案 2 :(得分:0)

我讨厌这种情况发生时。完全是另一回事,我的持久性bean搞砸了。当我在POST方法中注释掉“super.create(card)”时,一切正常(请求正文或否)。

仍然不知道为什么会导致“400:错误的请求。客户端发出的请求在语法上是不正确的。”

似乎我有另外一个问题需要弄清楚,但至少这个问题已经解决了。

感谢你们的帮助!