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?

0
Cloud 19 listopad 2018, 09:42

1 odpowiedź

Najlepsza 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).

1
dave_thompson_085 19 listopad 2018, 15:01