json - book - tellraw generator 1.13 2
¿Cómo puedo agregar un encabezado adicional en el cuerpo de la respuesta? (3)
Aquí está la solución como sugerencia de M. Deinum.
@RequestMapping(value="ajaxSuccess", method = RequestMethod.GET)
public ResponseEntity<Map<String, Object>> ajaxSuccess(){
Map<String, Object> message = new HashMap<String, Object>();
message.put("severity", "info");
message.put("location", "/");
message.put("summary", "Authenticated successfully.");
message.put("code", 200);
Map<String, Object> json = new HashMap<String, Object>();
json.put("success", true);
json.put("message", message);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json; charset=UTF-8");
headers.add("X-Fsl-Location", "/");
headers.add("X-Fsl-Response-Code", "302");
return (new ResponseEntity<Map<String, Object>>(json, headers, HttpStatus.OK));
}
Solo vea el fragmento de código del método de acción del controlador SpringMVC-3.2.x
. Es bastante fácil generar JSON
pero no se puede agregar un encabezado personalizado adicional solo para esta acción / método de acción específico para un controlador específico. no es común para todos los @ResponseBody
acción JSON
@ResponseBody
.
@RequestMapping(value="ajaxDenied", method = RequestMethod.GET)
public @ResponseBody Map<String, Object> ajaxDenied(ModelMap model) {
Map<String, Object> message = new HashMap<String, Object>();
message.put("severity", "error");
message.put("summary", "Restricted access only");
message.put("code", 200);
Map<String, Object> json = new HashMap<String, Object>();
json.put("success", false);
json.put("message", message);
return json;
}
De manera diferente, podría agregar encabezados adicionales como mi demanda, pero aquí hay un problema al generar JSON
puro. Se genera Buggy JSON
y es capaz de analizar algunos navegadores.
@RequestMapping(value="ajaxSuccess", method = RequestMethod.GET)
public ResponseEntity<String> ajaxSuccess(){
Map<String, Object> message = new HashMap<String, Object>();
message.put("severity", "info");
message.put("location", "/");
message.put("summary", "Authenticated successfully.");
message.put("code", 200);
Map<String, Object> json = new HashMap<String, Object>();
json.put("success", true);
json.put("message", message);
String data = "";
try {
ObjectMapper mapper = new ObjectMapper();
data = mapper.writeValueAsString(json);
} catch (Exception e) { //TODO
}
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json; charset=UTF-8");
headers.add("X-Fsl-Location", "/");
headers.add("X-Fsl-Response-Code", "302");
return (new ResponseEntity<String>(data, headers, HttpStatus.OK));
}
este método de acción podría generar una cadena JSON
con carácter de escape en lugar de JSON
puro, por lo que depende del navegador cómo se analizará, por lo que se produce un error en Chrome. La salida se parece a
"{/"message/":{/"summary/":/"Authenticated successfully./",/"location/":/"//",/"severity/":/"info/",/"code/":/"200/"},/"success/":true}"
pero nuestra salida deseada
{
"message":{
"summary": "Authenticated successfully.",
"location":"/",
"severity":"info",
"code":"200"
},
"success":true
}
Quiero generar JSON
puro con encabezados adicionales basados en condiciones para la acción específica de un controlador específico.
Puede agregar encabezados al generador de ResponseEntity. Creo que está más limpio de esta manera.
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8");
ResponseEntity.ok()
.headers(headers)
.body(data);
También puede usar HttpServletResponse
para agregar su estado y encabezados de una manera más fácil:
@RequestMapping(value="ajaxSuccess", method = RequestMethod.GET)
@ResponseBody
public String ajaxSuccess(HttpServletResponse response) {
response.addHeader("header-name", "value");
response.setStatus(200);
return "Body";
}
Por lo tanto, debe agregar la siguiente dependencia de maven como se indica :
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>7.0.53</version>
<scope>provided</scope>
</dependency>