Oto moja prośba o zwinięcie:
curl -X POST --data-urlencode 'data1@/Users/Documents/file.csv' http://localhost:8000/predict
Poniżej znajduje się moja równoważna implementacja Java.
String filePath = inputFilePath;
String url = inputUrl;
File file = new File(filePath);
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost uploadFile = new HttpPost(inputUrl);
uploadFile.addHeader("content-type", "application/x-www-form-urlencoded;charset=utf-8");
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
FileBody fileBody = new FileBody(new File(inputFilePath));
HttpEntity reqEntity = MultipartEntityBuilder.create()
.addPart("data1", fileBody)
.build();
uploadFile.setEntity(reqEntity);
CloseableHttpResponse response = null;
try {
response = httpClient.execute(uploadFile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Próbuję wywołać mój punkt końcowy interfejsu API R Rest z mojego wpisu Java HTTP.
#* @post /predict
mypredict <- function(data1) {
print(data1)
}
(1) Czy moje równoważne żądanie Java HTTP Post jest poprawne? (2) Mogę wywołać punkt końcowy spoczynku R za pomocą polecenia curl. Ale z jakiegoś powodu, kiedy wysłałem żądanie POST za pomocą mojego kodu Java, widzę, że data1 nie jest przesyłana jako część żądania post. Widzę ten błąd w R.
<simpleError in print(data1): argument "data1" is missing, with no default>
Uważam, że moja równoważna implementacja curl w Javie jest zła. Czy ktoś może pomóc?
1 odpowiedź
Określasz typ treści application/x-www-form-urlencoded
(jak robi to curl w tym przypadku), ale dostarczasz rzeczywistą treść (jednostkę), która odpowiada multipart/form-data
, która jest radykalnie inna. Zamiast tego użyj URLEncodedFormEntity
zawierających (dla twojego przypadku) jeden NameValuePair
coś takiego:
byte[] contents = Files.readAllBytes (new File(filepath).toPath());
List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>();
list.add(new BasicNameValuePair("data1", new String(contents,charset));
uploadFile.setEntity(new UrlEncodedFormEntity (list));
I nie potrzebujesz addHeader("content-type",...)
, ponieważ ustawienie encji automatycznie dostarcza nagłówek content-type (i content-length).
Podobne pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].