Commit 2b36006d by Patryk Czarnik

Response.created itp.

parent 9e3c16a7
......@@ -12,10 +12,12 @@ import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.Status;
import jakarta.ws.rs.core.UriBuilder;
import sklep.db.CustomerDAO;
import sklep.db.DBConnection;
import sklep.db.DBException;
import sklep.db.OrderDAO;
import sklep.db.RecordNotFound;
import sklep.model.Customer;
import sklep.model.Order;
@RequestScoped
......@@ -83,5 +85,4 @@ public class ROrder {
return Response.seeOther(customerURI).build();
}
}
}
package sklep.rest;
import java.math.BigDecimal;
import java.net.URI;
import java.util.List;
import jakarta.ws.rs.Consumes;
......@@ -11,6 +12,8 @@ import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.UriBuilder;
import sklep.db.DBConnection;
import sklep.db.DBException;
import sklep.db.ProductDAO;
......@@ -18,18 +21,27 @@ import sklep.db.RecordNotFound;
import sklep.model.Product;
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
* (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
*
* 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
* 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.
*
* 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")
......@@ -105,16 +117,17 @@ public class RProducts {
// 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).
@POST
@Consumes({"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()) {
ProductDAO productDAO = db.productDAO();
productDAO.save(product);
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