2016-04-13 7 views
0

Ich folgte dieser tutorial zu implementieren Rest API mit Spring Boot zum Herunterladen von Dateien (XML-Format).HTTP 406 Herunterladen einer Datei mit Rest Anruf

Mein Controller-Klasse ist wie folgt:

@RestController 
public class RistoreController { 
    @Autowired 
    private RistoreService ristoreService; 

    @RequestMapping( 
      value = "/ristore/foundation/{trf}", 
      method = RequestMethod.GET, 
      produces = "application/xml") 
    public ResponseEntity<InputStream> getXMLById(@PathVariable("trf") String trf) throws IOException { 
     InputStream inputStream = ristoreService.findByTRF(trf); 
     return ResponseEntity 
       .ok() 
       .contentType(MediaType.parseMediaType("application/octet-stream")) 
       .body(inputStream); 
    } 
} 

Ich habe Service-Schnittstelle RistoreService autowired in der Steuerung und Bean-Klasse für diesen Dienst wie folgt aussieht:

@Service 
public class RistoreServiceBean implements RistoreService { 
    public InputStream findByTRF(String trf) throws IOException { 
     String filePath = "/Users/djiao/Box Sync/Work/Projects/RIStore/foundation/foundation_new/" + trf + ".xml"; 
     File file = new File(filePath); 
     return new FileInputStream(file); 
    } 
} 

ich die Anwendung getestet die Verwendung von folgender curl-Befehl:

curl -i -H "Accept: application/xml" http://localhost:8080/ristore/foundation/TRF133672_1455294493597 

Allerdings Ich habe 406 Fehler, "nicht akzeptabel". Irgendetwas stimmt nicht mit dem Dateiformat?

Antwort

1

Versuchen Sie, die Definition des Controllers, dass

 @RequestMapping(value = "/ristore/foundation/{trf}", method = RequestMethod.GET, produces = "application/xml") 
    public ResponseEntity<InputStreamResource> downloadXMLFile(@PathVariable("trf") String trf) 
      throws IOException { 

     // Optinal headers configuration 

HttpHeaders headers = new HttpHeaders(); 

     headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); 
     headers.add("Pragma", "no-cache"); 
     headers.add("Expires", "0"); 


     // get the inputStream 

    InputStream xmlFileInputStream = ristoreService.findByTRF(trf); 



     return ResponseEntity 
       .ok() 
       .headers(headers) 
       .contentType(MediaType.parseMediaType("application/octet-stream")) 
       .body(new InputStreamResource(xmlFileInputStream)); 
    } 

Dann wird Ihr Service Art und Weise zu ändern, Klasse wäre:

@Service 
public class RistoreServiceBean implements RistoreService { 
    public InputStream findByTRF(String trf) throws IOException { 
     String filePath = "/Users/djiao/Box Sync/Work/Projects/RIStore/foundation/foundation_new/" + trf + ".xml"; 
     File file = new File(filePath); 
     return new FileInputStream(file); 
    } 
} 

406 Not Acceptable Die Ressource durch die Anforderung identifiziert ist, nur in der Lage Antworteinheiten zu erzeugen, den Inhalt Merkmale nicht akzeptabel gemäß den in der Anforderung gesendeten Header akzeptiert.

Das bedeutet, dass der zurückgegebene Eingangsstrom als Ressource betrachtet werden muss, sobald Sie einen REST-Controller haben.

+0

Das funktioniert. Ich habe '@PathVariable (" trf ") String trf als Argument für die Methode' downloadXMLFile' hinzugefügt. Ich glaube nicht, 'InputStream' hat' contentLength() 'Methode, wenn Sie' xmlFileInputStream' durch 'xmlFile' meinen. – ddd

+0

Ich habe die Antwort bearbeitet, um die @pathVariable hinzuzufügen, die ich vergessen habe. Aber die Sache hier war hauptsächlich wegen des ResourceInputStream für die Gründe, die ich in der Antwort erklärte. Für die Dateilänge hast du recht. In meinem Fall würde ich eine Datei vom Dienst zurückgeben und dann die Datei im Controller konvertieren. In diesem Fall können Sie die Dateilänge erhalten. Vergessen Sie nicht, die Antwort zu bestätigen. –

1

Die folgenden zwei Zeilen im Code contradict einander:

  .contentType(MediaType.parseMediaType("application/octet-stream")) 

und

 produces = "application/xml") 
+0

Geändert zu 'contentType (MediaType.parseMediaType (" application/xml "))' und immer noch den gleichen Fehler. – ddd

+0

Es gibt eigentlich keinen Widerspruch. Es mietet den Inhalt als Oktettstrom, der nach dem Sammeln als Körper für eine XML-Datei (Anwendung/xml) wieder zusammengesetzt wird. –