2016-04-27 17 views
2

Ich brauche eine Anwendung zu schreiben, die von Curl, wie geschickt binäre Daten zu verarbeiten wäre in der Lage:Wie bekomme ich rohe Binärdaten von einer POST-Anfrage, die von Spring bearbeitet wurde?

curl localhost:8080/data --data-binary @ZYSF15A46K1.txt 

Ich habe eine POST-Verarbeitungsverfahren wie folgt erstellt:

@RequestMapping(method = RequestMethod.POST, value = "/data") 
    public void acceptData(HttpEntity<byte[]> requestEntity) throws Exception { 
     process(requestEntity.getBody()); 
    } 

aber es scheint keine rohen Binärdaten zurückzugeben. Ich habe versucht, eine GZip-Datei zu senden, und nachdem ich durch Spring gegangen bin, ist sie jetzt länger dekomprimierbar, was mich zu der Annahme verleitet, dass ich entweder zu viele Daten oder zu wenig Daten bekomme.

Wie löse ich dieses Problem und bekomme rohe Binärdaten?

+0

Versuchen Sie 'HttpServletDequest' als Eingabeparameter Ihres Controllers zu verwenden und lesen Sie Rohdaten von 'InputStream'. –

+0

@GeminiKeith versuchte das auch, es gibt aus irgendeinem Grund immer ein leeres Objekt zurück. –

+0

haben Sie jemals die Zeichencodierung eingestellt? Sie können die 'Content-Length' überprüfen, um sicherzustellen, dass Sie die richtige Anfrage erhalten. Wenn "Content-Length" gültig ist, können Sie es aus 'InputStream' mit einer bestimmten Länge lesen. Wenn nicht, überprüfen Sie bitte Ihre Anfrage. –

Antwort

2

Es ist so einfach wie einen Inputstream in Ihrem Controller-Methode die Parameter erklärt:

@RequestMapping(method = RequestMethod.POST, value = "/data") 
public void acceptData(InputStream dataStream) throws Exception { 
    processText(dataStream); 
} 

Sie sollten nicht HiddenHttpMethodFilter deaktivieren müssen, wenn Sie es wahrscheinlich tun, dass Ihre Anfrage in irgendeiner Weise falsch ist. Siehe https://github.com/spring-projects/spring-boot/issues/5676.

5

konnte ich diese mit dem folgenden Code beheben:

standardmäßig
@Bean 
public FilterRegistrationBean registration(HiddenHttpMethodFilter filter) { 
    FilterRegistrationBean registration = new FilterRegistrationBean(filter); 
    registration.setEnabled(false); 
    return registration; 
} 

@RequestMapping(method = RequestMethod.POST, value = "/data") 
public void acceptData(HttpServletRequest requestEntity) throws Exception { 
    byte[] processedText = IOUtils.toByteArray(requestEntity.getInputStream()); 
    processText(processedText); 
} 

Frühling tut Vorverarbeitung, die die HttpServletRequest verursacht durch die Zeit leer sein es die RequestMapping erreicht. Hinzufügen der FilterRegistrationBean Bean löst dieses Problem.

+0

Ja, das habe ich vergessen. Der Standard für den Eingangsstrom kann nur einmal gelesen werden. –