studio example ejemplo java json rest struts2 struts2-rest-plugin

java - example - retrofit android studio



Complemento API REST: use cuerpo en lugar de cadena de consulta para parĂ¡metros (1)

Estoy usando esto como referencia para crear una configuración REST solo en Struts2:

https://cwiki.apache.org/confluence/display/WW/REST+Plugin

Tengo un modelo, recibo con algunos campos de prueba: título, cuerpo.

Actualmente para crear un recibo, envío una solicitud de esta manera:

POST /receipt/?body=new_body&title=new_title

y me crea un recibo con el nuevo cuerpo y título pasados.

Esto no funciona:

POST /receipt/ { "body": "new_body", "title": "new title" }

Aquí hay un código:

struts.xml :

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <bean type="org.apache.struts2.rest.handler.ContentTypeHandler" name="jackson" class="org.apache.struts2.rest.handler.JacksonLibHandler"/> <constant name="struts.rest.handlerOverride.json" value="jackson"/> <constant name="struts.enable.DynamicMethodInvocation" value="false"/> <constant name="struts.devMode" value="true"/> <constant name="struts.rest.content.restrictToGET" value="false"/> <constant name="struts.rest.defaultExtension" value="json"/> <constant name="struts.rest.handlerOverride.EXTENSION" value="json"/> <constant name="struts.i18n.encoding" value="UTF-8"/> <constant name="struts.action.extension" value="xhtml,,xml,json,action"/> <constant name="struts.mapper.class" value="org.apache.struts2.dispatcher.mapper.PrefixBasedActionMapper" /> <constant name="struts.mapper.prefixMapping" value="/receipt:rest,:struts"/> <constant name="struts.convention.action.suffix" value="Controller"/> <constant name="struts.convention.action.mapAllMatches" value="true"/> <constant name="struts.convention.default.parent.package" value="receipto"/> <constant name="struts.convention.package.locators" value="controllers,actions"/> </struts>

ReceiptController.java :

public class ReceiptController implements ModelDriven<Object> { private ReceiptManager receiptManager = new ReceiptManager(); private String id; private Receipt model = new Receipt(); private Collection list; public Object getModel() { return (list==null ? model : list); } public HttpHeaders create() { receiptManager.save(model); return new DefaultHttpHeaders("create"); } public HttpHeaders show() { model = receiptManager.find(id); return new DefaultHttpHeaders("show"); } public HttpHeaders update() { receiptManager.save(model); return new DefaultHttpHeaders("update"); } public HttpHeaders destroy() { model = receiptManager.destroy(id); return new DefaultHttpHeaders("destroy"); } public HttpHeaders index() { list = receiptManager.list(); return new DefaultHttpHeaders("index").disableCaching(); } public String getId() { return id; } public void setId(String id) { this.id = id; } }

¿Se supone que debe funcionar como yo quiero, o simplemente funciona el plugin?


Supongo que ese cartero está enviando JSON en el cuerpo de la solicitud y establece el tipo de contenido application/json . Struts puede analizar la solicitud si agrega un interceptor json a la pila.

<interceptor-stack name="myStack"> <interceptor-ref name="json"/> <interceptor-ref name="myInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack>

La descripción del interceptor "json" en el complemento JSON :

Si se utiliza el interceptor, la acción se completará con el contenido JSON en la solicitud, estas son las reglas del interceptor:

  • El "tipo de contenido" debe ser "application / json"
  • El contenido de JSON debe estar bien formado, consulte json.org para gramática.
  • La acción debe tener un método público "setter" para los campos que deben rellenarse.
  • Los tipos admitidos para población son: Primitivos (int, largo ... Cadena), Fecha, Lista, Mapa, Matrices primitivas, Otra clase (más sobre esto más adelante), y Matriz de Otra clase.
  • Cualquier objeto en JSON, que se debe llenar dentro de una lista, o un mapa, será de tipo Map (asignación de propiedades a valores), cualquier número entero será de tipo Long, cualquier número decimal será de tipo Double, y cualquier conjunto de tipo List.

Recursos: