java - java中如何将这个curl请求转换为Http post请求进行文件上传?

标签 java rest curl

以下是我的 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 休息端点。但由于某种原因,当我通过 Java 代码发送 POST 请求时,我发现 data1 没有作为 post 请求的一部分传递。我在 R 中看到此错误。

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

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

最佳答案

您指定内容类型application/x-www-form-urlencoded(就像curl在本例中所做的那样),但提供与multipart/form-相对应的实际主体(实体) data 这是完全不同的。相反,使用包含(针对您的情况)一个NameValuePairURLEncodedFormEntity,如下所示:

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

关于java - java中如何将这个curl请求转换为Http post请求进行文件上传?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53369539/

相关文章:

java - 对 List<Generic> 显式强制转换的怀疑

java - 在 Android 客户端中处理来自 Jersey 服务器的多部分响应

javascript - 无法使用 Node js 将错误放入 REST API 中

laravel - Curl 和 Laravel,总是重定向

php - 如何在 Linux Debian 上安装 PHP cURL?

java - 在java中的一个可运行线程中调用不同的方法

java - 测试两个客户端直接连接相同的IP和端口

java - 在 second/之前删除字符串的一部分

security - 带时间窗的 HMAC

php - 简单的 PHP cURL 文件上传到 Azure 存储 blob