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: