1. ホーム
  2. スプリング

レスポンスボディとレスポンスエンテイティ

2022-03-02 15:38:22

最初の記事

からです。

http://stackoverflow.com/questions/22725143/what-is-the-difference-between-responseentityt-and-responsebody

ResponseEntity を使用すると、任意の HTTP レスポンスヘッダを柔軟に定義することができます。4番目のコンストラクタはこちらをご覧ください。

http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/http/ResponseEntity.html

ResponseEntity(T body, MultiValueMap<String,String> headers, HttpStatus statusCode) 


HTTPレスポンスヘッダの一覧はこちらをご覧ください。

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Responses

よく使われるものに、Status、Content-Type、Cache-Controlがあります。

それが必要ない場合は、@ResponseBodyを使用すると、ほんの少し簡潔になります。



2つ目の記事

からです。

http://stackoverflow.com/questions/26549379/when-use-responseentityt-and-restcontroller-for-spring-restful-applications

ResponseEntity は、HTTPレスポンス全体を表すものです。ステータスコード、ヘッダ、ボディなど、その中に入るものはすべて制御することができます。

@ResponseBody は HTTP レスポンスボディを表すマーカーであり @ResponseStatus は、HTTP レスポンスのステータスコードを宣言しています。

@ResponseStatus これはメソッド全体をマークしているので、ハンドラメソッドが常に同じように動作することを確認する必要があります。そのためには HttpServletResponse または HttpHeaders パラメータを使用します。

基本的には ResponseEntity を使えば、もっといろいろなことができるようになります。



第3回記事

からです。

http://www.concretepage.com/spring-4/spring-4-mvc-jsonp-example-with-rest-responsebody-responseentity

このページでは、REST、@ResponseBody、ResponseEntityを使ったSpring 4 MVCとJSONPのサンプルを提供します。JSONPとは、JSONにパディングを施したものです。これは、Webブラウザで実行されるJavaScriptコードをサポートしており、通常は同一生成元ポリシーのために禁止されている、異なるドメインのサーバーからのデータを要求することができます。このポリシーによれば、Webブラウザは、あるWebブラウザのスクリプトコードが、同じドメイン内の別のWebブラウザからデータにアクセスすることを許可することができます。しかし、このポリシーは <script> ここからは、JSONPの役割が見えてくる。JSONPは、異なるドメインのデータにアクセスするために <script> タグをWebブラウザで表示します。もし、URLが
http://localhost:8080/concretepage-1/book1?callback=myfunction
という JSONP レスポンスを投げる場合。

<スパン <スパン
myfunction({"bookName":"Godan","writer":"Premchand"});
 

として、別のドメインで使用することができます。
<スパン <スパン <スパン
 src=" http://localhost:8080/concretepage-1/book1?callback=myfunction " type="application/javascript"> 
 

JSONPにアクセスするためのクライアントコードの中には、すでに myfunction() をスクリプトコードで定義しています。Springを使用してJSONPレスポンスを投げるために、SpringはAbstractJsonpResponseBodyAdviceクラスを提供しており、これは@ControllerAdviceでアノテーションされたクラスで実装されています。

Spring 4のAbstractJsonpResponseBodyAdviceによるJSONPのサポート

JSONPレスポンスに対応するクラスを探します。
JsonpAdvice.java
<スパン <スパン
@ControllerAdvice
public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
    public JsonpAdvice() {
        super("callback");
    }
} 

コンストラクタの中で、キーを渡して super メソッドを呼び出す必要があります。このキーは、JSONPデータを要求する際のURLのクエリストリングに使用されます。これにより、JSONPデータを応答するRESTウェブサービスと、@ResponseBodyとResponseEntityを使って応答するコントローラメソッドを容易にすることができます。

Spring RESTによるJSONP

JSONを生成するために、この例で使用されているBeanを探します。
ブック.java
<スパン
public class Book {
        private String bookName;
        private String writer;
	public String getBookName() {
		return bookName;
	}
	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
} 

We are creating a web service which will respond JSONP.
BookService.java
@RestController
class BookService {
    @RequestMapping(value= "/book1", produces = MediaType.APPLICATION_JSON_VALUE)
    Book bookInfo1() {
    	Book book = new Book();
    	book.setBookName("Godan");
    	book.setWriter("Premchand");
        return book;
    }
} 

When we access the URL http://localhost:8080/concretepage-1/book1?callback=functionCall , it will throw the response as
functionCall({"bookName":"Godan","writer":"Premchand"});
 

JSONP with @ResponseBody and ResponseEntity

Now find a controller in which we have created methods that will return @ResponseBody and ResponseEntity.
@Controller
class BookController {
    @RequestMapping(value ="/book2", produces =MediaType.APPLICATION_JSON_VALUE )
    @ResponseBody
    Book bookInfo2() {
    	Book book = new Book();
    	book.setBookName("Ramcharitmanas");
    	book.setWriter("TulasiDas");
    	return book;
    }
    @RequestMapping(value ="/book3", produces =MediaType.APPLICATION_JSON_VALUE )
    public ResponseEntity<Book> bookInfo3() {
    	Book book = new Book();
    	book.setBookName("Ramayan");
    	book.setWriter("Valmiki");
        return ResponseEntity.accepted().body(book);
    } 
} 

When we access the URL http://localhost:8080/concretepage-1/book2?callback=functionCall , we will get the output in browser as
functionCall({"bookName":"Ramcharitmanas","writer":"TulasiDas"});
 

And for the URL http://localhost:8080/concretepage-1/book3?callback=functionCall , the output will be
functionCall({"bookName":"Ramayan","writer":"Valmiki"});
 

JSONP Client Code

Now we will write client code which can be used in any other domain.
jsonptest.html


     function functionCall(data) {   
		console.log(data.bookName);
		console.log(data.writer);
		console.log('-----------');
     }
   
  
  
        



         src="http://localhost:8080/concretepage-1/book1?callback=functionCall" type="application/javascript"> 
	
	



	 src="http://localhost:8080/concretepage-1/book2?callback=functionCall" type="application/javascript"> 
	
	



	 src="http://localhost:8080/concretepage-1/book3?callback=functionCall" type="application/javascript"> 
  
 




         src="http://localhost:8080/concretepage-1/book1?callback=functionCall" type="application/javascript"> 
	
	




	 src="http://localhost:8080/concretepage-1/book2?callback=functionCall" type="application/javascript"> 
	
	




	 src="http://localhost:8080/concretepage-1/book3?callback=functionCall" type="application/javascript"> 
  
 

Run this page and check the output in console.

Now we are done. Happy Learning!

Download Source Code

spring-4-mvc-jsonp-example-with-rest-responsebody-responseentity.zip