swagger
swagger-ui
Szukaj…
Uwagi
Fajnie, jeśli masz spory pomysł na następujące elementy:
REST WS Concepts (JAX-RS) Zastosowanie adnotacji Aplikacja sieci Web Standardy API REST API Maven i jego zależność
swagger-ui z jersey REST WS
Jak podaje oficjalna strona Swagger :
Swagger ma zdefiniować standardowy, niezależny od języka interfejs API REST, który pozwala zarówno ludziom, jak i komputerom odkryć i zrozumieć możliwości usługi bez dostępu do kodu źródłowego, dokumentacji lub poprzez kontrolę ruchu sieciowego. Prawidłowo zdefiniowany za pomocą Swagger konsument może zrozumieć i obsługiwać usługę zdalną przy minimalnej logice implementacji. Podobnie jak w przypadku interfejsów programowania niższego poziomu, Swagger usuwa zgadywanie podczas wywoływania usługi.
Zakładając, że używasz Maven i jersey, musisz dodać następującą zależność: Zależność Maven Swagger wraz z zależnościami JAX-RS. Teraz musisz utworzyć „maven webapp” i pod webappem musisz wkleić zawartość obecną na tym adresie URL . Po wklejeniu tych treści do projektu struktura folderów aplikacji internetowej powinna wyglądać następująco:
Następnie wykonaj następujące kroki:
- Utwórz plik Java o dowolnej nazwie (w naszym przypadku jest to „
ApiOriginFilter.java
”) podobny do poniższego:
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ApiOriginFilter implements javax.servlet.Filter {
/**
* doFilter
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse res = (HttpServletResponse) response;
res.addHeader("Access-Control-Allow-Origin", "*");
res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
res.addHeader("Access-Control-Allow-Headers", "Content-Type, api_key, Authorization");
chain.doFilter(request, response);
}
/**
* destroy
*/
@Override
public void destroy() {
}
/**
* init
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
Ten plik zapewni filtrowanie przychodzących żądań zgodnie z klasą.
- Utwórz plik java o dowolnej nazwie, w naszym przypadku jego nazwa to „
SwaggerJaxrsConfig.java
” w następujący sposób:
import org.eclipse.persistence.jaxb.MarshallerProperties;
import org.eclipse.persistence.jaxb.BeanValidationMode;
import org.glassfish.jersey.moxy.json.MoxyJsonConfig;
import org.glassfish.jersey.moxy.json.MoxyJsonFeature;
import org.glassfish.jersey.moxy.xml.MoxyXmlFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.ServerProperties;
import org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature;
import io.swagger.jaxrs.config.BeanConfig;
public class SwaggerJaxrsConfig extends ResourceConfig {
public SwaggerJaxrsConfig() {
BeanConfig beanConfig = new BeanConfig();
beanConfig.setTitle("Swagger API Title");
beanConfig.setVersion("1.0.0");
beanConfig.setSchemes(new String[] { "http" });
beanConfig.setHost("localhost:8080/swagger-ui");
beanConfig.setBasePath("/rest");
beanConfig.setResourcePackage(
"your.restws.package");
beanConfig.setScan(true);
property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, Boolean.TRUE);
packages("your.restws.package");
packages("io.swagger.jaxrs.listing");
register(MoxyJsonFeature.class);
// register(BadRequestExceptionMapper.class);
register(new MoxyJsonConfig().setFormattedOutput(true)
// Turn off BV otherwise the entities on server would be validated by MOXy as well.
.property(MarshallerProperties.BEAN_VALIDATION_MODE, BeanValidationMode.NONE).resolver());
register(MoxyXmlFeature.class);
register(RolesAllowedDynamicFeature.class);
}
}
Jak widać, w powyższej klasie podaliśmy wszystkie szczegóły wymagane do korzystania z interfejsu użytkownika swagger, takiego jak Host, na którym ten projekt swagger będzie hostowany, wraz z możliwością ustawienia wybranej ścieżki podstawowej oraz wszystkich obsługiwanych protokołów HTTP, takich jak „ http
” lub „ https
” i jeszcze więcej szczegółów zgodnie z wymaganiami. Istnieje również możliwość poinformowania Swagger o całej lokalizacji REST WS, którą można ustawić za pomocą setResourcePackage
wraz z pakietami. Ta klasa pozwala nam korzystać z interfejsu użytkownika Swagger z naszymi dostosowaniami.
Teraz wprowadź dwa powyższe pliki do pliku web.xml, aby użyć ich po wdrożeniu naszej aplikacji na serwerze, w następujący sposób:
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>your.package.SwaggerJaxrsConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>ApiOriginFilter</filter-name>
<filter-class>your.package.ApiOriginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ApiOriginFilter</filter-name>
<url-pattern>/rest/*</url-pattern>
</filter-mapping>
Teraz przejdziemy do rzeczywistego kodu, w którym użyjemy Swagger pod warunkiem Adnotacje:
Utwórz fasolę Employee.java jak poniżej:
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel("Employee bean")
public class Employee {
private String name;
private String id;
private String dept;
@ApiModelProperty(value = "Name of employee", example = "Test Employee")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ApiModelProperty(value = "Id of employee", example = "123456")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@ApiModelProperty(value = "Department of employee", example = "IT Division", allowableValues = "IT, Sales, Admin")
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
}
Użyte tutaj elementy Swagger to:
-
@ApiModel("Employee bean")
- to decyduje o nazwie klasy Bean, która musi być wyświetlana w interfejsie użytkownika Swagger. -
@ApiModelProperty(value ="ABC", example="DeptName")
- dostarczy informacji o każdym polu używanym w@ApiModelProperty(value ="ABC", example="DeptName")
bean. wartość zapewnia opis pola, a przykład podaje przykładową wartość tego pola.
Teraz utworzymy kontroler REST w następujący sposób, aby utworzyć usługę GET w następujący sposób:
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.GenericEntity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.swagger.ws.bean.Employee;
import org.swagger.ws.service.EmployeeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
@Path("/employee")
@Api(tags = {"Employee"})
public class EmployeeController {
private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeController.class);
@GET
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
@ApiOperation(produces="application/json", value = "Fetch employee details", httpMethod="GET", notes = "<br>This service fetches Employee details", response = Employee.class)
@ApiResponses(value = { @ApiResponse(code = 200,response = Employee.class, message = "Successful operation"),@ApiResponse(code = 400, message = "Bad Request", response = Error.class), @ApiResponse(code = 422, message = "Invalid data", response = Error.class), @ApiResponse(code = 500, message = "Internal Server Error", response = Error.class) })
public Response getEmployee() {
EmployeeService employeeService = new EmployeeService();
Employee empDetails = employeeService.getEmployee();
Response response;
LOGGER.debug("Fetching employee");
GenericEntity<Employee> entity = new GenericEntity<Employee>(empDetails){};
response = Response.status(200).entity(entity).build();
return response;
}
}
Użyte tutaj elementy Swagger to:
-
@Api(tags = {"Employee"})
- ta adnotacja powie Swaggerowi, jaki powinien być tytuł usługi internetowej. W tym przypadku tytuł to „Employee
”. Należy pamiętać, że kilka standardów podczas pisania REST WS ma również zastosowanie podczas pisania dokumentacji Swagger, takiej jak tytuł, nie powinien być podobny do „GetEmployee
” lub „DeleteEmployee
” itp. -
@ApiOperation(produces="application/json", value = "Fetch employee details", httpMethod="GET", notes = "<br>This service fetches Employee details", response = Employee.class)
- Ta adnotacja zawiera krótki pomysł o twojej usłudze internetowej.-
produces
opisuje format odpowiedzi, -
value
opisuje krótki pomysł na temat usługi internetowej -
notes
opisują szczegółowe informacje o tej usłudze internetowej w przypadku jej wystąpienia.
-
-
@ApiResponses(value = { @ApiResponse(code = 200,response = Employee.class, message = "Successful operation"),@ApiResponse(code = 400, message = "Bad Request", response = Error.class), @ApiResponse(code = 422, message = "Invalid data", response = Error.class), @ApiResponse(code = 500, message = "Internal Server Error", response = Error.class) })
- Te adnotacje umożliwiają nam obsługiwać różne typy kodów stanuHTTP
, które mogą być odbierane jako odpowiedź podczas korzystania z tej usługi internetowej. Pozwala nam ustawić kod błędu, niestandardowy komunikat, a nawet pozwala nam wychwycić ten błąd w oddzielnej klasie błędów, jeśli jest to wymagane.
Na koniec musimy stworzyć rzeczywistą klasę usług, która pobierze dane pracowników, gdy usługa internetowa zostanie wykorzystana przez klienta. Możesz go zaimplementować zgodnie z wymaganiami. Oto przykładowa usługa do celów demonstracyjnych:
public class EmployeeService {
public Employee getEmployee() {
Employee employee = new Employee();
employee.setId("1");
employee.setName("Test");
employee.setDept("IT");
return employee;
}
}
Teraz możesz już zobaczyć dokumentację interfejsu użytkownika Swagger. Wdróż projekt Swagger i uruchom serwer. Teraz przejdź do przeglądarki i kliknij adres URL swojego projektu. W tym przypadku jest to
http: // localhost: 8080 / swagger-ui /
Jeśli swagger jest poprawnie skonfigurowany, powinieneś zobaczyć następujący ekran:
Teraz, aby zobaczyć dokumentację usługi internetowej, wpisz „base_url / rest / swagger.json” swojego projektu w polu tekstowym ( http://exampl.com/api), które możesz zobaczyć na powyższym obrazku. Po podaniu tego adresu URL w polu tekstowym możesz zobaczyć następujący ekran z dokumentacją Twojej usługi REST:
W polu tekstowym, w którym na powyższym obrazku zapisany jest „ api key
”, możesz podać konkretną wartość nagłówka lub klucza, jeśli Twój projekt wymaga uwierzytelnienia na podstawie identyfikatora użytkownika itp. W tym celu należy również wprowadzić zmiany w <input placeholder="api_key" ......
index.html pod tagiem zaczynające się od <input placeholder="api_key" ......
Kolejną dodatkową zaletą Swagger-UI jest przycisk „ Try it out!
”. Ten przycisk pozwala ci zobaczyć, jaka może być odpowiedź tej usługi. W takim przypadku kliknięcie tego przycisku spowoduje wyświetlenie następującej odpowiedzi na ekranie:
To jest przykładowe demo dla interfejsu użytkownika Swagger. Istnieje wiele opcji, które wciąż można odkryć podczas pisania kontrolera REST, które pomogą ci na poziomie dokumentacji poprzez użycie większej liczby adnotacji i ich atrybutów.