以下是我的卷曲要求:
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实现是错误的。有人可以帮忙吗?
答案 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",...)
,因为设置实体会自动提供内容类型标头(和内容长度)。