如何使用RestTemplate发送带有自定义头部参数的POST请求

5

我需要发送一个自定义参数的POST请求(包含路径的"data")并将内容类型设置为text/plain。我查看了大量类似的问题,但是发布的解决方案都没有帮助。

该方法应列出此目录中的文件。

我的代码如下:

    public List<FileWrapper> getFileList() {

    MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
    map.add("data", "/public/");

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.TEXT_PLAIN);

    HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(
            map, headers);
    String url = "http://192.168.1.51:8080/pi/FilesServlet";
    restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
    restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
    String response = restTemplate
            .postForObject(url, request, String.class);
    List<FileWrapper> list = new ArrayList<>();
    for (String part : response.split("\\|")) {
        System.out.println("part " + part);
        list.add(new FileWrapper(part));
    }
    return list;
}

以下是等效的JavaScript工作代码:

function getFileList(direction){
$("div.file-list").html("<center><progress></progress></center>");
$.ajax({
  url: "http://192.168.1.51:8080/pi/FilesServlet",
  type: "POST",
  data: direction ,
  contentType: "text/plain"
})

由于请求返回空字符串表示路径无效,因此该参数未被添加。期望的响应格式为文件名*文件大小|文件名*文件大小 ...

提前致谢。


对 $data 字段值进行 UrlEncode,并将其附加到 URL 字符串中的相应位置。 - Robert Rowntree
@RobertRowntree data 不是 URL 的一部分,这是 POST 方法,data 值是一个参数。 - Asalas77
@Asalas77,这个AJAX请求的输入数据格式是{'data':'/public/'}吗?你能在JS代码中打印方向并在这里回复吗? - nilesh
你能否通过curl执行此请求?curl -i -k -H "Content-Type:text/plain" -X POST -d '{"data":"/public/"}' "http://192.168.1.51:8080/pi/FilesServlet" - nilesh
@nilesh 我被分配的curl略有不同 curl -X POST --data "/private/" --header "Content-Type: text/plain" localhost:2222/pi/FilesServlet,但我现在不在工作岗位上,无法远程操作,所以我明天早上会尝试两种方法并在这里回复结果。 - Asalas77
显示剩余5条评论
1个回答

12

从评论讨论中可以清楚地看出,您的请求对象不正确。如果您传递的是包含文件夹名称的普通字符串,则不需要使用MultiValueMap。只需尝试发送一个字符串即可。

    String data = "/public/"
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.TEXT_PLAIN);

    HttpEntity<String> request = new HttpEntity<String>(
            data, headers);
    String url = "http://192.168.1.51:8080/pi/FilesServlet";
    restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
    restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
    String response = restTemplate
            .postForObject(url, request, String.class);

你能展示一下如何使用这个方法发送一个文件作为多部分表单数据的例子吗? - Asalas77
你尝试过将内容类型标头设置为 MediaType.MULTIPART_FORM_DATA 吗? - nilesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接