Commit cad30a2c by Patryk Czarnik

PUT i POST

parent c975e387
package sklep.rest; package sklep.rest;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import sklep.db.DBConnection; import sklep.db.DBConnection;
import sklep.db.DBException; import sklep.db.DBException;
import sklep.db.ProductDAO; import sklep.db.ProductDAO;
import sklep.db.RecordNotFound;
import sklep.model.Product; import sklep.model.Product;
// To jest "klasa zasobu" (resource class), czyli klasa odpowiedzialna za obsługę rekordów określonego typu.
// Adres /products oznacza "katalog produktów", a adres /products/3 wskazuje konkretny produkt nr 3.
// Zapytania typu GET oznaczają odczyt danych, PUT zapis, DELETE usunięcie.
// POST może oznaczać rózne rzeczy, ale najczęściej jest uzywany do dodawania nowych rekordów.
@Path("/products") @Path("/products")
public class RProducts { public class RProducts {
...@@ -23,5 +34,62 @@ public class RProducts { ...@@ -23,5 +34,62 @@ public class RProducts {
} }
} }
@GET
@Produces("application/json")
@Path("/{id}")
public Product readOne(@PathParam("id") int productId) throws DBException, RecordNotFound {
try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO();
return productDAO.findById(productId);
}
}
// 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.
// Struktura adresów URL powjnna odpowiadać logicznej strukturze danych.
@GET
@Produces("application/json")
@Path("/{id}/price")
public BigDecimal getPrice(@PathParam("id") int productId) throws DBException, RecordNotFound {
try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO();
Product product = productDAO.findById(productId);
return product.getPrice();
}
}
// Operacja PUT oznacza "zapisz dane pod podanym adresem".
// Może być uzyta zarówno do zapisnaia nowych danych, jak i do aktualiazcji, ale najważniejsze jest, że musimy podać adres, pod którym zapisujemy.
// W zapytaniu PUT jest przysyłana jakaś treść (content/body/entity)
// - 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ść
@PUT
@Consumes("application/json")
@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.update(product);
db.commit();
}
}
// Powszechnie przyjętą praktyką w REST jest to, że
// zapytanie typu POST przysłane pod adres katalogu (np. /products)
// jest traktowane jako polecenie dodania nowego rekordu.
@POST
@Consumes("application/json")
public void addProduct(Product product) throws DBException {
try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO();
if(product.getProductId() != null) {
throw new IllegalArgumentException("Nowy produkt nie może mieć ustawionego ID");
}
productDAO.insertNew(product);
db.commit();
}
}
} }
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