🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

3947閲覧

『@CrossOrigin』RestApi POSTについて

ding

総合スコア2

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/03/23 15:27

編集2021/03/24 05:02

Spring boot REST APIを用いて機能を構築しております。
GETは呼び出せる状態なのですが、POSTやPUTがサーバーを呼び出すことが出来ずに躓いております。

呼び出せない原因として『@CrossOrigin』が影響していることは突き止めました。
『@CrossOrigin』を外すことでPOST、PUTが呼び出せることを確認することが出来たためです。
なぜ、設定していると呼び出せないのか分からないためご教授いただければ幸いです。

Talend APIを利用し確認を行っております。

下記の形でsendしております。

http://localhost:8080/api/product/post HEADERS Content-Type:application/json

コードは以下になります。

java

1@RestController 2@RequestMapping("api") 3@CrossOrigin(origins = {"xxx"}) 4public class RestApi extends HttpServlet { 5 @GetMapping("/product/get") 6 public JsonEntity getProduct(@RequestParam(name = "id", required = true) Integer id 7 ) throws IOException { 8          ~省略~ 9 } 10 11 @RequestMapping(value="/product/post", method = RequestMethod.POST, consumes = "application/json") 12// @RequestMapping(value="/product/post") 13// @RequestMapping(method = RequestMethod.POST) 14// @PostMapping("/product/post") 15// @ResponseBody 16 public JsonEntity postProduct() throws IOException { 17          ~省略~ 18 } 19 20}

java

1 @Override 2 public void configure(HttpSecurity http) throws Exception{ 3 http 4 .authorizeRequests() 5 .antMatchers("/webjars/**").permitAll() 6 .antMatchers("/css/**").permitAll() 7 .antMatchers("/login").permitAll() 8 .antMatchers("/signup").permitAll() 9 .antMatchers("/rest/**").permitAll() 10 .antMatchers("/api/**").permitAll() 11 .antMatchers("/admin").hasAuthority("ROLE_ADMIN") 12 .anyRequest().authenticated(); 13 14 RequestMatcher csrfMatcher = new RestMatcher("/api/**"); 15 16 http.csrf().requireCsrfProtectionMatcher(csrfMatcher);

追記

HTTP

1POST /api/product/post HTTP/1.1 2Content-Length: 0 3Content-Type: application/json 4Host: localhost:8080 5 6HTTP/1.1 403 7Vary: Origin 8Vary: Access-Control-Request-Method 9Vary: Access-Control-Request-Headers 10X-Content-Type-Options: nosniff 11X-XSS-Protection: 1; mode=block 12Cache-Control: no-cache, no-store, max-age=0, must-revalidate 13Pragma: no-cache 14Expires: 0 15X-Frame-Options: DENY 16Transfer-Encoding: chunked 17Date: Wed, 24 Mar 2021 04:56:33 GMT 18Keep-Alive: timeout=60 19Connection: keep-alive 20[message-body; type: "application/octet-stream", size: 20 bytes]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gpsoft

2021/03/24 03:55

「POSTやPUTがサーバーを呼び出すことが出来ず」とのことですが、Talend APIで送信するとどうなるのでしょうか? HTTPタブに、リクエストとレスポンスの内容が表示されると思うので、可能なら、それを追記してみていただけますか。
ding

2021/03/24 05:02

HTTPタブ内の情報を追記させていただきました。
guest

回答1

0

ベストアンサー

なぜ、設定していると呼び出せないのか分からない

403レスポンスが返ってますね。

@CrossOriginアノテーションは、クロスオリジンなAPIリクエストに関する設定を制御するためのものです。
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/CrossOrigin.html

@CrossOrigin(origins = {"xxx"})と書くと、「xxxというオリジンからのリクエストしか受け付けない」みたいな意味になります。そのため、Talend API Testerでリクエストを送ると、403エラーが返ります。実験的に、Talend API Testerで、リクエストヘッダにOrigin: xxxを追加してみてください。リクエストが成功すると思います。

APIを開発するときは、どのドメインからのAPI使用を許可したいか、に応じてoriginsの値を決めましょう。@CrossOrigin(origins = {"*"})と書いておけば、「どんなオリジンでも許す」という意味になると思います。

なぜGETのときは成功したのか? とか、疑問も残ると思いますが、詳しくは、CORSについて調べてみてください。

投稿2021/03/24 09:14

gpsoft

総合スコア1323

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ding

2021/03/24 12:23

ご回答ありがとうございます。 『Origin: xxx』をリクエストヘッダに追加することで成功しました。 仰る通り疑問は残っていますので、CORSについて調べていこうと思います。
gpsoft

2021/03/24 20:17

「Origin: xxx」は、あくまでも、理解を深めるための実験です。 ↓こっちの方を変えるのが普通だと思います。 @CrossOrigin(origins = {"xxx"})
ding

2021/03/25 06:35

なるほど、仰っている意図は何となく分かりました。 そちらで対応出来るよう、また頑張っていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問