Commit 2b36006d by Patryk Czarnik

Response.created itp.

parent 9e3c16a7
...@@ -12,10 +12,12 @@ import jakarta.ws.rs.Produces; ...@@ -12,10 +12,12 @@ import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.Status; import jakarta.ws.rs.core.Response.Status;
import jakarta.ws.rs.core.UriBuilder; import jakarta.ws.rs.core.UriBuilder;
import sklep.db.CustomerDAO;
import sklep.db.DBConnection; import sklep.db.DBConnection;
import sklep.db.DBException; import sklep.db.DBException;
import sklep.db.OrderDAO; import sklep.db.OrderDAO;
import sklep.db.RecordNotFound; import sklep.db.RecordNotFound;
import sklep.model.Customer;
import sklep.model.Order; import sklep.model.Order;
@RequestScoped @RequestScoped
...@@ -83,5 +85,4 @@ public class ROrder { ...@@ -83,5 +85,4 @@ public class ROrder {
return Response.seeOther(customerURI).build(); return Response.seeOther(customerURI).build();
} }
} }
} }
package sklep.rest; package sklep.rest;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.net.URI;
import java.util.List; import java.util.List;
import jakarta.ws.rs.Consumes; import jakarta.ws.rs.Consumes;
...@@ -11,6 +12,8 @@ import jakarta.ws.rs.PUT; ...@@ -11,6 +12,8 @@ import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path; import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam; import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces; import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.UriBuilder;
import sklep.db.DBConnection; import sklep.db.DBConnection;
import sklep.db.DBException; import sklep.db.DBException;
import sklep.db.ProductDAO; import sklep.db.ProductDAO;
...@@ -18,18 +21,27 @@ import sklep.db.RecordNotFound; ...@@ -18,18 +21,27 @@ import sklep.db.RecordNotFound;
import sklep.model.Product; import sklep.model.Product;
import sklep.photo.PhotoUtil; import sklep.photo.PhotoUtil;
/* W usługach REST struktura adresów URL odpowiada logicznej strukturze danych. /* JAX-RS - część Javy EE
* Aplikacja (projekt) składa się z wielu "resource classes", z których każda obsługuje pewien rodzaj encji
* np. pod adresem /products działa ta klasa RProduct, która zajmuje się obsługą produktów
* a pod adresem /orders działa ROrder, która zajmuje się zamówieniami.
* Przykładowa dobra (szczegółowa) dokumentacja: https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest3x/index.html
*
* W usługach REST struktura adresów URL odpowiada logicznej strukturze danych.
* Typowe jest, że * pod adresem "katalogu", np. /products , dostępna jest lista wszystkich rekordów * Typowe jest, że * pod adresem "katalogu", np. /products , dostępna jest lista wszystkich rekordów
* (lub ogólne informacje, lub jakiś sposób przeglądania - gdyby było ich za dużo do zwrócenia na raz) * (lub ogólne informacje, lub jakiś sposób przeglądania - gdyby było ich za dużo do zwrócenia na raz)
* a idąc dalej wgłąb ścieżki przechodzimy do "pojedynczych rekordów", np. /products/2 * a idąc dalej wgłąb ścieżki przechodzimy do "pojedynczych rekordów", np. /products/2
* *
* W tej klasie wejdziemynawet do wnętrza produktów i udostępnimy osobno cenę * W tej klasie wejdziemy nawet do wnętrza produktów i udostępnimy osobno cenę
* /products/2/price * /products/2/price
* 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. * Ta klasa udostępnia (i przyjmuje) dane produktów w różnych formatach.
* Gdy w Produces jest wiele formatów, to klient może wybrać za pomocą nagłówka Accept
* Gdy w Consumes jest wiele formatów, to klient może przysłać dane w dowolnym z nich (nagłówek Content-Type)
*
*/ */
@Path("/products") @Path("/products")
...@@ -105,16 +117,17 @@ public class RProducts { ...@@ -105,16 +117,17 @@ public class RProducts {
// W praktyce REST metoda POST jest używana do dodawania nowych rekordów do katalogu. // W praktyce REST metoda POST jest używana do dodawania nowych rekordów do katalogu.
// 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", "application/xml"}) @Consumes({"application/json", "application/xml"})
@Produces({"application/json", "application/xml"}) @Produces({"application/json", "application/xml"})
public Product zapiszProdukt(Product product) throws DBException { public Response zapiszProdukt(Product product) throws DBException {
try(DBConnection db = DBConnection.open()) { try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO(); ProductDAO productDAO = db.productDAO();
productDAO.save(product); productDAO.save(product);
db.commit(); db.commit();
return product;
URI uri = UriBuilder.fromResource(RProducts.class).path("/{id}").build(product.getProductId());
return Response.created(uri).build();
} }
} }
......
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