Вопрос по rest, playframework-2.0 – Визуализировать формат вывода (HTML, JSON, XML) в зависимости от параметра?

11

Есть лиgood или правильный способ визуализации вывода в Play Framework в зависимости от параметра? Пример:

For HTML:

http://localhost:9000/user/get/5?v=HTML // should render HTML template

For JSON:

http://localhost:9000/user/get/5?v=JSON // should render JSON template

Я думаю, что перехватчик запросов может иметь возможность достичь этого, но я понятия не имею, как начать или с чего начать :-(

Или, возможно, написать общийrender method который читает параметры и вывод в соответствии с запросом, но это мне кажется излишним?

Ваш Ответ

3   ответа
0

чтобы пользователь мог просматривать браузер как HTML или как JSON, поэтому метод accept у меня не работал.

Я решил это, поместив универсальный renderMethod в базовый класс со следующим синтаксисом стиля

public static Result requestType( )
{
    if( request().uri().indexOf("json") != -1)
    {
        return ok(Json.toJson(request()));
    }
    else 
    {
        return ok("Got HTML request " + request() );
    }
}
20

/user/5?v=html а также/user/5?v=json возвращать два представления одного и того же ресурса, они должны быть одного и того же URL, например/user/5в соответствии сПринципы ОТДЫХА.

На стороне клиента вы можете использоватьAccept заголовок в ваших запросах, чтобы указать, какое представление вы хотите, чтобы сервер отправил вам.

На стороне сервера вы можете написать следующее с помощью Play 2.1, чтобы проверить значениеAccept заголовок:

public static Result user(Long id) {

  User user = User.find.byId(id);
  if (user == null) {
    return notFound();
  }

  if (request().accepts("text/html")) {
    return ok(views.html.user(user));
  } else if (request().accepts("application/json")) {
    return ok(Json.toJson(user));
  } else {
    return badRequest();
  }
}

Обратите внимание, что тест против"text/html" всегда должен быть написан до любого другого типа контента, потому что браузеры устанавливаютAccept заголовок их запросов к*/* который соответствует всем типам.

вы не хотите писатьif (request().accepts(…)) в каждом действии вы можете выделить его, например, как следующее:

public static Result user(Long id) {
  User user = User.find.byId(id);
  return representation(user, views.html.user.ref);
}

public static Result users() {
  List<User> users = User.find.all();
  return representation(users, views.html.users.ref);
}

private <T> Result representation(T resource, Template1<T, Html> html) {
  if (resource == null) {
    return notFound();
  }

  if (request().accepts("text/html")) {
    return ok(html.apply(resource));
  } else if (request().accepts("application/json")) {
    return ok(Json.toJson(resource));
  } else {
    return badRequest();
  }
}
хорошо, я думаю, что я хотел бы еще один. Но как насчет привязки к объектам Java, основанным на форме HTML или объекте JSON (из запросов), мне также необходимо реализовать их с помощью оператора if / else? Или будетbindFromRequest служить обоим? adis
bindFromRequest использует строку запроса и тело запроса (это может быть JSON, закодированная форма URL и т. д.).
2

используйте 2 маршрута (как вы не укажете, я буду использовать примеры Java:

public static Result userAsHtml(Long id) {
    return ok(someView.render(User.find.byId(id)));
}

public  static Result userAsJson(Long id) {
    return play.libs.Json.toJson(User.find.byId(id));
}

маршруты:

/GET    /user/get/:id/html     controllers.YourController.userAsHtml(id:Long)
/GET    /user/get/:id/json     controllers.YourController.userAsJson(id:Long)

Затем вы можете просто сделать ссылку в другом представлении для отображения данных пользователя.

<a href="@routes.YourController.userAsHtml(user.id)">Show details</a>
<a href="@routes.YourController.userAsJson(user.id)">Get JSON</a>

или что-то другое...

edit #1

Вы также можете использовать общиеif или жеcase определить окончательный результат

public static Result userAsV() {
    String vType = form().bindFromRequest().get("v");

    if (vTtype.equals("HTML")){
        return ok(someView.render(User.find.byId(id)));
    }

    return play.libs.Json.toJson(User.find.byId(id));
}
Это может сработать, но дублирование не будет моим первым выбором. У меня нет прямого варианта использования для этого, но в будущем, если я захочу создать собственное мобильное приложение, я бы хотел просто запросить JSON ... adis
Ну как хочешь, проверьedit #1

Похожие вопросы