Как преобразовать этот запрос curl в Http после запроса на загрузку файла в Java? - PullRequest
0 голосов
/ 19 ноября 2018

Следующий мой запрос локона:

curl -X POST --data-urlencode 'data1@/Users/Documents/file.csv' http://localhost:8000/predict

Ниже приводится моя эквивалентная реализация 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();
        }

Я пытаюсь вызвать мою конечную точку API R Rest из моего сообщения Java HTTP.

#* @post /predict
mypredict <- function(data1) {
  print(data1)

}

(1) Мой эквивалентный запрос Java HTTP Post правильный? (2) Я могу вызвать конечную точку отдыха R, используя мою команду curl. Но по какой-то причине, когда я отправил запрос POST через мой Java-код, я вижу, что data1 не передается как часть запроса post. Я вижу эту ошибку в R.

<simpleError in print(data1): argument "data1" is missing, with no default>

Я чувствую, что моя Java-реализация curl неверна. Может кто-нибудь помочь?

1 Ответ

0 голосов
/ 19 ноября 2018

Вы указываете тип контента application/x-www-form-urlencoded (как curl делает для этого случая), но предоставляете фактическое тело (сущность), которое соответствует multipart/form-data, которое радикально отличается. Вместо используйте URLEncodedFormEntity, содержащий (для вашего случая) один NameValuePair что-то вроде этого:

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));

И вам не нужно addHeader("content-type",...), поскольку при настройке сущности автоматически предоставляется заголовок типа контента (и длина контента).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...