2017-05-21 1 views
0

私はREST APIを学び、フェッチを使用してJavascriptからJavaで書かれたPOSTサービスを呼び出そうとしています。リクエストが@Producesと@ConsumeがMediaTypeの場合にサービスに到達しません.APPLICATION_JSONjavascriptから呼び出しをフェッチしてJava RESTサービスにアクセスできない

同じAPIで他の単純なPOSTメソッドとGETメソッドが正しく動作していますが、JSONを送受信する必要がある場合データが機能していません。以下は

私の呼び出しフェッチである:以下

let options = { 
    method: "POST", 
    headers: new Headers({'content-type': 'application/json'}), 
    body: JSON.stringify({ 
      "Title": "title" 
      }) 
    }; 
    const url = "http://localhost:8080/myserver/data/list"; 
    return fetch(url, options); 

を私のREST APIです:

@Path("/data") 
public class Controller { 
@POST 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
@Path("/list") 
public Response createList(CreateListJsonData dta) throws IOException { 
System.out.println("in create list"); 
return Response.status(200) 
      .entity("{\"dummykey\"}:\"dummyVal\"") 
      .header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT") 
      .build(); 
} 

CreateListJsonDataクラスは以下の通りです:

@XmlRootElement 
public class CreateListJsonData { 
    private String Title; 
    public String getTitle() { 
     return Title; 
    } 
    public void setTitle(String title) { 
     Title = title; 
    } 
} 

は、web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 
    <display-name>myserver</display-name> 
    <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>default.html</welcome-file> 
    <welcome-file>default.htm</welcome-file> 
    <welcome-file>default.jsp</welcome-file> 
    </welcome-file-list> 
    <servlet> 
     <servlet-name>Jersey Web Application</servlet-name> 
     <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
     <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>com.myserver</param-value> 
    </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Jersey Web Application</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

Eclipse用のtomcatでAPIを実行しています。私が要求をトリガするとき、私は、コンソール上のメッセージの下に取得する:

com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes 
INFO: Couldn't find grammar element for class javax.ws.rs.core.Response 

誰もがここに私のミスを把握するために私を助けてくださいことはできますか?

+0

'INFO:' - それはあなたがCORSに「標準」と考えられていない 'コンテンツ-type'が設定されているように、おそらく応答がクライアント –

+0

に送信され、エラーではありませんあなたは 'CORS preflight' OPTIONSリクエストをトリガしています - あなたのサーバは' OPTIONS'リクエストメソッドを処理していますか? '.header("アクセス制御 - 許可 - メソッド "、" GET、POST、DELETE、PUT ")は、 –

答えて

1

これはドメイン間の状況のようです(CORS)。

このコンテンツタイプでは、要求はもはや「シンプル」ではなく、Preflighted requestです。それはあなたのサーバーが(あなたが扱うPOSTに加えて)OPTIONSメソッドを処理する必要があります。戻る必要があるヘッダーについては、リンク先の記事を参照してください。通常、このような何か:

Access-Control-Allow-Methods: GET, POST, DELETE, PUT, OPTIONS 
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type 
Access-Control-Allow-Origin: * 
関連する問題