Commit 05956ec8 by Patryk Czarnik

Metody produkujące HTML

parent da548994
...@@ -26,9 +26,15 @@ import sklep.photo.PhotoUtil; ...@@ -26,9 +26,15 @@ import sklep.photo.PhotoUtil;
@Path("/products") @Path("/products")
public class RProducts { public class RProducts {
// Gdy w adnotacji @Produces umieszczona jest lista content-typów,
// to serwer jest w stanie wygenerować odpowiedź w każdym z tych formatów.
// Jeśli w zapytaniu znajduje się nagłówek Accept, to znaczy, że klient prosi o podany format (lub kilka)
// i serwer stara się dostosować do tych preferencji.
// Jeśli nie ma nagłówka Accept, to standard JAX-RS nie mówi co ma się stać,
// ale implementacja REST Easy (WildFly/JBoss) zastosuje pierwszy z formatów podanych w adnmotacji.
// Glassfish i WebLogic tak nie robią - wybierają "losowo".
@GET @GET
@Produces("application/json") @Produces({"application/json", "application/xml", "text/plain"})
public List<Product> readAll() throws DBException { public List<Product> readAll() throws DBException {
try(DBConnection db = DBConnection.open()) { try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO(); ProductDAO productDAO = db.productDAO();
...@@ -36,8 +42,24 @@ public class RProducts { ...@@ -36,8 +42,24 @@ public class RProducts {
} }
} }
// W ramach JAX-RS można utworzyć wiele metod, które działają pod tym samym adresem,
// ale różnią się obsługiwanymi formatami danych (Produces/Consumes).
// W zależności od preferecji klienta zostanie wywołana jedna lub druga metoda.
@GET @GET
@Produces("application/json") @Produces("text/html")
public String readAllHTML() throws DBException {
List<Product> products = readAll();
StringBuilder txt = new StringBuilder("<html><body>");
txt.append("<h1>Lista produktów:</h1>");
for(Product product : products) {
txt.append(product.toHtml());
}
txt.append("</body></html>");
return txt.toString();
}
@GET
@Produces({"application/json", "application/xml", "text/plain"})
@Path("/{id}") @Path("/{id}")
public Product readOne(@PathParam("id") int productId) throws DBException, RecordNotFound { public Product readOne(@PathParam("id") int productId) throws DBException, RecordNotFound {
try(DBConnection db = DBConnection.open()) { try(DBConnection db = DBConnection.open()) {
...@@ -46,11 +68,23 @@ public class RProducts { ...@@ -46,11 +68,23 @@ public class RProducts {
} }
} }
@GET
@Produces("text/html")
@Path("/{id}")
public String readOneHTML(@PathParam("id") int productId) throws DBException, RecordNotFound {
Product product = readOne(productId);
StringBuilder txt = new StringBuilder("<html><body>");
txt.append("<h1>Odczytany produkt:</h1>");
txt.append(product.toHtml());
txt.append("</body></html>");
return txt.toString();
}
// To twórca usługi decyduje o tym, jakie dokładnie adresy będą dostepne, nie ma obowiązku obsługiwania wszystkich, // To twórca usługi decyduje o tym, jakie dokładnie adresy będą dostepne, nie ma obowiązku obsługiwania wszystkich,
// ale gdybyśmy chcieli dać bezpośredni doste do wybranego pola w rekordzie, to tak jak w tym przykładzie. // ale gdybyśmy chcieli dać bezpośredni doste do wybranego pola w rekordzie, to tak jak w tym przykładzie.
// Struktura adresów URL powjnna odpowiadać logicznej strukturze danych. // Struktura adresów URL powjnna odpowiadać logicznej strukturze danych.
@GET @GET
@Produces("application/json") @Produces({"application/json", "text/plain"})
@Path("/{id}/price") @Path("/{id}/price")
public BigDecimal getPrice(@PathParam("id") int productId) throws DBException, RecordNotFound { public BigDecimal getPrice(@PathParam("id") int productId) throws DBException, RecordNotFound {
try(DBConnection db = DBConnection.open()) { try(DBConnection db = DBConnection.open()) {
...@@ -65,8 +99,10 @@ public class RProducts { ...@@ -65,8 +99,10 @@ public class RProducts {
// W zapytaniu PUT jest przysyłana jakaś treść (content/body/entity) // W zapytaniu PUT jest przysyłana jakaś treść (content/body/entity)
// - format, w jakim te dane są przysyłane, opisuje adnotacja @Consumes // - format, w jakim te dane są przysyłane, opisuje adnotacja @Consumes
// - metoda może mieć jeden parametr bez żadnej adnotacji i to właśnie poprzez ten prametr jest przekazywna przysłana wartość // - metoda może mieć jeden parametr bez żadnej adnotacji i to właśnie poprzez ten prametr jest przekazywna przysłana wartość
// Gdy adnotacja @Consumes zawiera kilka formatów, to klient może przysłać dane w każdym z nich.
@PUT @PUT
@Consumes("application/json") @Consumes({"text/plain", "application/json"})
@Path("/{id}/price") @Path("/{id}/price")
public void setPrice(@PathParam("id") int productId, BigDecimal newPrice) throws DBException, RecordNotFound { public void setPrice(@PathParam("id") int productId, BigDecimal newPrice) throws DBException, RecordNotFound {
try(DBConnection db = DBConnection.open()) { try(DBConnection db = DBConnection.open()) {
...@@ -83,7 +119,7 @@ public class RProducts { ...@@ -83,7 +119,7 @@ public class RProducts {
// jest traktowane jako polecenie dodania nowego rekordu. // jest traktowane jako polecenie dodania nowego rekordu.
// W tej wersji w odpowiedzi odsyłany jest cały rekord Product uzupełniony o pole ID. // W tej wersji w odpowiedzi odsyłany jest cały rekord Product uzupełniony o pole ID.
@POST @POST
@Consumes("application/json") @Consumes({"application/json", "application/xml"})
@Produces("application/json") @Produces("application/json")
public Product addProduct(Product product) throws DBException { public Product addProduct(Product product) throws DBException {
try(DBConnection db = DBConnection.open()) { try(DBConnection db = DBConnection.open()) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment