주로 모바일 앱에 콘텐츠를 제공하는 프로젝트를 계획하고 있지만 웹 사이트가 필요합니다.
제 질문은 Jersey 또는 Restlet을 사용하여 모바일 앱용 REST API를 개발 한 다음 Play를 사용하는 것이 합리적입니까? 웹 사이트를 제공합니다.
아니면 그냥 Play를 사용하는 것이 더 합리적입니까? 다할까요? 그렇다면 Play로 REST를 수행하는 방법! 뼈대?
답변
요청에 따라 간단한 REST 방식입니다. Codemwncis의 솔루션이 작동하는 방식과 거의 동일하지만 콘텐츠 협상에 Accept 헤더를 사용합니다. 먼저 경로 파일 :
GET /user/{id} Application.user
POST /user/ Application.createUser
PUT /user/{id} Application.updateUser
DELETE /user/{id} Application.deleteUser
여기에 콘텐츠 유형을 지정하지 않습니다. IMHO는 특정 리소스에 대한 “특별한”URI를 원할 때만 필요합니다. /users/feed/
Atom / RSS에서 항상 반환 하도록 경로를 선언하는 것과 같습니다 .
애플리케이션 컨트롤러는 다음과 같습니다.
public static void createUser(User newUser) {
newUser.save();
user(newUser.id);
}
public static void updateUser(Long id, User user) {
User dbUser = User.findById(id);
dbUser.updateDetails(user); // some model logic you would write to do a safe merge
dbUser.save();
user(id);
}
public static void deleteUser(Long id) {
User.findById(id).delete();
renderText("success");
}
public static void user(Long id) {
User user = User.findById(id)
render(user);
}
보시다시피 getUserJSON 메서드 만 제거하고 getUser 메서드의 이름을 변경했습니다. 다양한 콘텐츠 유형이 작동하려면 이제 여러 템플릿을 만들어야합니다. 원하는 각 콘텐츠 유형에 대해 하나씩. 예를 들면 :
user.xml :
<users>
<user>
<name>${user.name}</name>
. . .
</user>
</users>
user.json :
{
"name": "${user.name}",
"id": "${user.id}",
. . .
}
user.html :
<html>...</html>
이 접근 방식은 모든 브라우저가 Accept 헤더에 텍스트 / html 콘텐츠 유형을 보내기 때문에 브라우저에 항상 HTML보기를 제공합니다. 다른 모든 클라이언트 (아마도 일부 JavaScript 기반 AJAX 요청)는 원하는 콘텐츠 유형을 정의 할 수 있습니다. jQuerys ajax () 메서드를 사용하면 다음을 수행 할 수 있습니다.
$.ajax({
url: @{Application.user(1)},
dataType: json,
success: function(data) {
. . .
}
});
JSON 형식의 ID가 1 인 사용자에 대한 세부 정보를 얻을 수 있습니다. Play는 현재 HTML, JSON 및 XML을 기본적으로 지원하지만 공식 문서 를 따르 거나 콘텐츠 협상 모듈을 사용하여 다른 유형을 쉽게 사용할 수 있습니다 .
Eclipse를 개발에 사용하는 경우 경로와 해당 콘텐츠 유형을 테스트 할 수 있는 REST 클라이언트 플러그인 을 사용하는 것이 좋습니다 .
답변
이것은 여전히 인기있는 질문이지만 가장 많이 득표 한 답변은 현재 버전의 플레이와 최신이 아닙니다. 다음은 play 2.2.1에서 작동하는 REST 예제입니다.
conf / routes :
GET /users controllers.UserController.getUsers
GET /users/:id controllers.UserController.getUser(id: Long)
POST /users controllers.UserController.createUser
PUT /users/:id controllers.UserController.updateUser(id: Long)
DELETE /users/:id controllers.UserController.deleteUser(id: Long)
app / controllers / UserController.java :
public static Result getUsers()
{
List<User> users = Database.getUsers();
return ok(Json.toJson(users));
}
public static Result getUser(Long id)
{
User user = Database.getUser(id);
return user == null ? notFound() : ok(Json.toJson(user));
}
public static Result createUser()
{
User newUser = Json.fromJson(request().body().asJson(), User.class);
User inserted = Database.addUser(newUser);
return created(Json.toJson(inserted));
}
public static Result updateUser(Long id)
{
User user = Json.fromJson(request().body().asJson(), User.class);
User updated = Database.updateUser(id, user);
return ok(Json.toJson(updated));
}
public static Result deleteUser(Long id)
{
Database.deleteUser(id);
return noContent(); // http://stackoverflow.com/a/2342589/1415732
}
답변
플레이를 사용하세요! 모든 것을 할 수 있습니다. Play에서 REST 서비스를 작성하는 것은 매우 쉽습니다.
첫째, 경로 파일을 사용하면 REST 접근 방식을 따르는 경로를 간단하게 작성할 수 있습니다.
그런 다음 생성하려는 각 API 메서드에 대해 컨트롤러에서 작업을 작성합니다.
결과를 반환하는 방법 (XML, JSON 등)에 따라 사용할 수있는 몇 가지 방법이 있습니다. 예를 들어 renderJSON 메서드를 사용하면 결과를 매우 쉽게 렌더링 할 수 있습니다. XML을 렌더링하려는 경우보기에서 HTML 문서를 빌드하는 것과 동일한 방식으로 수행 할 수 있습니다.
여기에 깔끔한 예가 있습니다.
경로 파일
GET /user/{id} Application.getUser(format:'xml')
GET /user/{id}/json Application.getUserJSON
POST /user/ Application.createUser
PUT /user/{id} Application.updateUser
DELETE /user/{id} Application.deleteUser
응용 프로그램 파일
public static void createUser(User newUser) {
newUser.save();
renderText("success");
}
public static void updateUser(Long id, User user) {
User dbUser = User.findById(id);
dbUser.updateDetails(user); // some model logic you would write to do a safe merge
dbUser.save();
renderText("success");
}
public static void deleteUser(Long id) {
// first check authority
User.findById(id).delete();
renderText("success");
}
public static void getUser(Long id) {
User user = User.findById(id)
renderJSON(user);
}
public static void getUserJSON(Long id) {
User user = User.findById(id)
renderJSON(user);
}
getUser.xml 파일
<user>
<name>${user.name}</name>
<dob>${user.dob}</dob>
.... etc etc
</user>
답변
JAX-RS 구현과 통합하는 것은 Play의 기본 제공 HTTP 라우팅을 사용하는 가능한 대안입니다. RESTEasy 예제는 RESTEasy Play! 모듈 .
이 접근법은 이미 JAX-RS에 투자했거나 컨텐츠 협상과 같이 JAX-RS가 제공하는 고급 기능 REST 중 일부가 필요한 경우에 적합합니다. 그렇지 않은 경우 HTTP 요청에 대한 응답으로 JSON 또는 XML을 제공하기 위해 Play를 직접 사용하는 것이 더 간단합니다.
답변
당신은 봐야합니다
http://www.lunatech-labs.com/open-source/resteasy-crud-play-module
crud 모듈이 관리 영역을 자동으로 구축하는 것처럼 자동으로 휴식 인터페이스를 구축하는 플레이 용 모듈입니다.
답변
이 접근 방식은 Play 버전 1.2.3에서 손상된 것 같습니다. @seb에서 수행하고 앞서 언급 한 https://github.com/sebhoss/play-user-sample 에서 언급 한 소스를 다운로드하면 JSON 개체와 함께 POST를 사용하여 새 사용자 개체를 더 이상 만들 수 없습니다.
json 및 xml POST를 사용하여 생성을위한 특정 방법이 필요합니다. 설명 : https://groups.google.com/forum/#!topic/play-framework/huwtC3YZDlU