如何将这个curl请求转换为Http post请求以在Java中上传文件?

时间:2018-11-19 06:42:34

标签: java rest curl

以下是我的卷曲要求:

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

我正在尝试从Java HTTP帖子中调用我的R Rest API端点。

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

}

(1)我等效的Java HTTP Post请求正确吗? (2)我可以使用curl命令调用R rest端点。但是由于某种原因,当我通过Java代码发送POST请求时,我看到data1没有作为发布请求的一部分传递。我在R中看到此错误。

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

我觉得我的Java等效curl实现是错误的。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

您可以指定内容类型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",...),因为设置实体会自动提供内容类型标头(和内容长度)。