Commit 9e3c16a7 by Patryk Czarnik

Multiformat

parent dfbfe23b
...@@ -28,13 +28,15 @@ import sklep.photo.PhotoUtil; ...@@ -28,13 +28,15 @@ import sklep.photo.PhotoUtil;
* W praktyce nie robi się tego zbyt często, ale tu zobaczymy jako przykład możliwości. * W praktyce nie robi się tego zbyt często, ale tu zobaczymy jako przykład możliwości.
* *
* To od programisty (twórcy usługi) zależy jakie adresy i jakie operacje pod tymi adresami udostępnia. * To od programisty (twórcy usługi) zależy jakie adresy i jakie operacje pod tymi adresami udostępnia.
*
* Ta klasa udostępnia (i przyjmuje) dane produktów w różnych formatach.
*/ */
@Path("/products") @Path("/products")
public class RProducts { public class RProducts {
@GET @GET
@Produces("application/json") @Produces({"application/json", "application/xml", "text/plain"})
public List<Product> wszystkieProdukty() throws DBException { public List<Product> wszystkieProdukty() throws DBException {
try(DBConnection db = DBConnection.open()) { try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO(); ProductDAO productDAO = db.productDAO();
...@@ -42,24 +44,47 @@ public class RProducts { ...@@ -42,24 +44,47 @@ public class RProducts {
} }
} }
// Może też być tak, że kilka metod działa pod tym samym adresem, ale służą one do tworzenia odpowiedzi w różnych formatach.
// Przykład: tworzenie HTML w oddzielnej metodzie
@GET
@Produces("text/html;charset=UTF-8")
public String wszystkieProduktyHTML() throws DBException {
try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO();
List<Product> products = productDAO.readAll();
StringBuilder txt = new StringBuilder("<!DOCTYPE html>\n<html><body>\n");
txt.append("<h1>Lista produktów</h1>\n");
for(Product product : products) {
txt.append(product.toHtml()).append('\n');
}
txt.append("</body></html>");
return txt.toString();
}
}
@GET @GET
@Path("/{id}") @Path("/{id}")
@Produces("application/json") @Produces({"application/json", "application/xml", "text/plain"})
public Product produktWgId(@PathParam("id") int productId) throws DBException, RecordNotFound { public Product jedenProdukt(@PathParam("id") int productId) throws DBException, RecordNotFound {
try(DBConnection db = DBConnection.open()) { try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO(); ProductDAO productDAO = db.productDAO();
return productDAO.findById(productId); return productDAO.findById(productId);
} }
} }
@Path("/{id}")
@GET
@Produces("text/html;charset=UTF-8")
public String jedenProduktHTML(@PathParam("id") int productId) throws DBException, RecordNotFound {
Product product = jedenProdukt(productId);
return "<!DOCTYPE html>\n<html><body>" + product.toHtml() + "</body></html>";
}
@GET @GET
@Path("/{id}/price") @Path("/{id}/price")
@Produces("application/json") @Produces({"application/json", "text/plain"})
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()) { return jedenProdukt(productId).getPrice();
ProductDAO productDAO = db.productDAO();
return productDAO.findById(productId).getPrice();
}
} }
// W zapytaniach typu PUT i POST klient wysyła dane na serwer (treść zapytania: "body" / "entity" / "content" ...) // W zapytaniach typu PUT i POST klient wysyła dane na serwer (treść zapytania: "body" / "entity" / "content" ...)
...@@ -67,7 +92,7 @@ public class RProducts { ...@@ -67,7 +92,7 @@ public class RProducts {
// (te dane, które przysłał klient). Format tych danych opisuje adnotacja @Consumes // (te dane, które przysłał klient). Format tych danych opisuje adnotacja @Consumes
@PUT @PUT
@Path("/{id}/price") @Path("/{id}/price")
@Consumes("application/json") @Consumes({"application/json", "text/plain"})
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()) {
ProductDAO productDAO = db.productDAO(); ProductDAO productDAO = db.productDAO();
...@@ -82,8 +107,8 @@ public class RProducts { ...@@ -82,8 +107,8 @@ public class RProducts {
// Może być także używana w innych celach - gdy klient ma "przysłać dane na serwer", a serwer coś z tym zrobi (podobnie jak to było w SOAP). // Może być także używana w innych celach - gdy klient ma "przysłać dane na serwer", a serwer coś z tym zrobi (podobnie jak to było w SOAP).
@POST @POST
@Consumes("application/json") @Consumes({"application/json", "application/xml"})
@Produces("application/json") @Produces({"application/json", "application/xml"})
public Product zapiszProdukt(Product product) throws DBException { public Product zapiszProdukt(Product product) throws DBException {
try(DBConnection db = DBConnection.open()) { try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO(); ProductDAO productDAO = db.productDAO();
......
package sklep.rest;
import java.math.BigDecimal;
import java.util.List;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import sklep.db.DBConnection;
import sklep.db.DBException;
import sklep.db.ProductDAO;
import sklep.db.RecordNotFound;
import sklep.model.Product;
import sklep.photo.PhotoUtil;
@Path("/products.json")
@Consumes("application/json")
@Produces("application/json")
public class RProductsJSON {
// Wszystkie metody, które coś produkują (czyli nie są void), produkują JSON-a
// (wyjątkiem jest photo - na pozimie metody można to ustawienie zmienić)
// Wszystkie metody, które coś konsumują (czyli posiadają parametr, w którym odbierane jest "ciało zapytania")
// konsumują JSON.
@GET
public List<Product> wszystkieProdukty() throws DBException {
try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO();
return productDAO.readAll();
}
}
@GET
@Path("/{id}")
public Product produktWgId(@PathParam("id") int productId) throws DBException, RecordNotFound {
try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO();
return productDAO.findById(productId);
}
}
@GET
@Path("/{id}/price")
public BigDecimal getPrice(@PathParam("id") int productId) throws DBException, RecordNotFound {
try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO();
return productDAO.findById(productId).getPrice();
}
}
@PUT
@Path("/{id}/price")
public void setPrice(@PathParam("id") int productId, BigDecimal newPrice) throws DBException, RecordNotFound {
try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO();
Product product = productDAO.findById(productId);
product.setPrice(newPrice);
productDAO.save(product);
db.commit();
}
}
@POST
public Product zapiszProdukt(Product product) throws DBException {
try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO();
productDAO.save(product);
db.commit();
return product;
}
}
@DELETE
@Path("/{id}")
public void usun(@PathParam("id") int productId) throws DBException, RecordNotFound {
try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO();
productDAO.delete(productId);
db.commit();
}
}
@GET
@Path("/{id}/photo")
@Produces("image/jpeg")
public byte[] foto(@PathParam("id") int productId) throws DBException, RecordNotFound {
return PhotoUtil.readBytes(productId);
}
}
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