2016-07-08 44 views
5

sto usando Primavera Boot (ultima versione, 1.3.6 ) e voglio creare un endpoint REST che accetta un mucchio di argomenti e un oggetto JSON. Qualcosa di simile:Come inviare un payload JSON a una @RequestParam in Spring MVC

curl -X POST http://localhost:8080/endpoint \ 
-d arg1=hello \ 
-d arg2=world \ 
-d json='{"name":"john", "lastNane":"doe"}' 

Nel controllore primavera Attualmente sto facendo:

public SomeResponseObject endpoint(
@RequestParam(value="arg1", required=true) String arg1, 
@RequestParam(value="arg2", required=true) String arg2, 
@RequestParam(value="json", required=true) Person person) { 

    ... 
} 

L'argomento json non viene serializzato in un oggetto Person. ottengo un

400 error: the parameter json is not present. 

Ovviamente, posso fare l'argomento json come stringa e analizzare il payload all'interno del metodo di controllo, ma questo tipo di sfida il punto di usare Spring MVC.

Funziona tutto se utilizzo @RequestBody, ma poi perdo la possibilità di POST di argomenti separati all'esterno del corpo JSON.

C'è un modo in Spring MVC per "mescolare" normali argomenti POST e oggetti JSON?

+1

I don Penso che ci sia un modo, e non credo che la combinazione di dati codificati in forma e dati JSON sia una buona idea. Decidi se vuoi accettare l'uno o l'altro. –

+1

Un sacco di API (Stripe, Plaid, Stormpath) utilizzano questo approccio per separare logicamente i dati delle richieste (ad esempio, se sto facendo una ricerca, posso inserire i criteri di ricerca in una rappresentazione Json e mantenere i dati di impaginazione nel bit codificato in forma della forma). Ma capisco il tuo punto. – Luciano

risposta

9

Sì, è possibile inviare sia params e corpo con un metodo POST: lato server Esempio:

@RequestMapping(value ="test", method = RequestMethod.POST) 
@ResponseStatus(HttpStatus.OK) 
@ResponseBody 
public Person updatePerson(@RequestParam("arg1") String arg1, @RequestParam("arg2") String arg2, @RequestBody Person input) throws IOException { 
    System.out.println(arg1); 
    System.out.println(arg2); 
    input.setName("NewName"); 
    return input; 
} 

e sul client:

curl -H "Content-Type:application/json; charset=utf-8" -X POST 'http://localhost:8080/smartface/api/email/test?arg1=ffdfa&arg2=test2' -d '{"name":"me","lastName":"me last"}' 

Godetevi

Problemi correlati