2016-07-19 6 views
0

Ich portiere derzeit eine alte API zu Spring Boot und habe ein Problem festgestellt. In der alten API können zwei Arten von cURL-Anfragen an den gleichen Endpunkt gestellt werden: einer für das Buchen von JSON-Daten und der andere für das Posten von JSON-Daten mit einer Datei. Die beiden Anfragen aussehen so:Spring Boot mehrere Anfragetypen für den gleichen Endpunkt

JSON Nur:

curl -i -X POST 'http://localhost:8080/myEndpoint' \ 
-H 'Accept:application/json' \ 
-H 'someheader:value' \ 
-H 'Content-Type:application/json' \ 
-d '{ "jsondata":"goesHere" }' 

JSON mit Bild:

curl -i -X POST 'http://localhost:8080/myEndpoint' \ 
-H 'Accept: application/json' \ 
-H 'Content-Type: multipart/mixed' \ 
-H 'someheader:value' \ 
-F '{ "jsondata":"goesHere" }' \ 
-F "[email protected]" 

Wie zu sehen ist, kann ich entweder einen Antrag Körper oder eine multipart/mixed Anfrage senden zu demselben Endpunkt, und je nachdem, was empfangen wird, wird der Server einige Geschäftslogik ausführen.

Ich habe versucht, dieses Verhalten zu replizieren ist Frühling wenig zu nutzen. Ich bin in der Lage, die JSON nur Anforderung mit Leichtigkeit zu replizieren:

@RequestMapping(value = "/myEndpoint", method = RequestMethod.POST) 
public ResponseEntity createActivityFile(@RequestHeader(value = "someheader") String someheader, 
             @RequestBody() String body,) { 
    // do something... 
    return new ResponseEntity(HttpStatus.OK); 
} 

Das Problem entsteht, wenn ich eine mehrteilige Datei in den Mix. Ich habe versucht:

@RequestMapping(value = "/myEndpoint", method = RequestMethod.POST) 
public ResponseEntity createActivityFile(@RequestHeader(value = "someheader") String someheader, 
             @RequestBody() String body, 
             @RequestPart(value = "file", required = false) MultipartFile file) { 
    // do something... 
    return new ResponseEntity(HttpStatus.OK); 
} 

Aber mit diesem, habe ich immer einen The request was rejected because no multipart boundary was found Fehler.

Das führt mich zu fragen, ist das, was ich versuche, mit Spring Boot zu tun? Wenn ja, wie würde meine RequestMapping aussehen?

Antwort

0

Sie können es tun, indem Sie @Consumes Anmerkung

verbraucht = MediaType.APPLICATION_JSON

Und anderen Endpunkt mit verschiedenen MediaType

+0

Nur um zu klären, ich bin mit dem gleichen Endpunkt ('/ myEndpoint') und ich werde zwei Funktionen diesem Endpunkt zugeordnet haben, mit dem Unterschied, dass sie "MediaType" verbraucht haben? –

+0

Ja, diese zwei Funktionen werden unterschiedliche Medientypen verbrauchen .... – shivam

+0

Ich habe es gerade ausprobiert und es funktioniert! Ihre Antwort ist jedoch nicht für den Spring Boot geeignet, der nicht "@ Verbraucht" hat. Stattdessen fügen Sie 'consumes = MediaType.APPLICATION_JSON' dem' @ RequestMapping' hinzu. Wenn Sie Ihre Antwort aktualisieren, nehme ich sie gerne an. –