RestTemplate put请求,参数传递不进去

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RestTemplate put请求,参数传递不进去相关的知识,希望对你有一定的参考价值。

代码如下:
@Override
public ResponseEntity<String> updateSelective(FromUser fromUser)
String url = "http://192.168.3.222:8888/api/v1/fromUser/updateSelective";
RestTemplate restTemplate = new RestTemplate();

HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type); //避免直接传入实体类而发生异常
headers.add("Accept", MediaType.APPLICATION_JSON.toString());

HttpEntity<String> formEntity = new HttpEntity<String>(JsonMapperUtils.getInstance().toJson(fromUser), headers);

return restTemplate.exchange(url, HttpMethod.PUT, formEntity, String.class);


此时参数传递不进去,全是null,可是如果把HttpMethod.PUT改成HttpMethod.POST就可以传递进去。请教各位put请求的写法。

RestTemplate put请求,参数传递不进去是设置错误造成的,解决方法为:

1、安装requests包,测试是否安装了requests,在命令行进入Python交互环境。

2、退出python交互环境,在命令行输入pip install requests。

3、安装完成后,进入python交互环境,输入命令测试get访问方法。

4、输入命令测试post访问方法r = requests.post('http://httpbin.org/post')print (r.text)。

5、输入命令测试put访问方法r = requests.put('http://httpbin.org/put')print (r.text)。

参考技术A 般处理要么是api丑陋一点,将方法也写在url里,要么是和null的回答一样,一些开发框架提供了input[name="_method"]的方式来实现,如express。
<form method="post" action="/">
<input type="hidden" name="_method" value="put" />
<input type="text" name="user[name]" />
<input type="text" name="user[email]" />
<input type="submit" value="Submit" />
</form>

app.put('/', function()
console.log(req.body.user);
res.redirect('back');
);

可以使用 RestTemplate PUT 传递我自己的对象

【中文标题】可以使用 RestTemplate PUT 传递我自己的对象【英文标题】:Can pass my own object with RestTemplate PUT 【发布时间】:2016-04-14 07:55:15 【问题描述】:

我想构建一个小型 RESTful 服务,使用我创建的类 (MyObject) 的对象发送 PUT 请求,并获得仅包含状态的响应。

我的控制者:

@RestController 
public class MyControler 

@RequestMapping(path = "/blabla/id", method = RequestMethod.PUT)
@ResponseBody
public ResponseEntity<String> putMethod (@PathVariable("id") Long id,
                                         @RequestBody MyObject t) 
   /*todo*/
   return new ResponseEntity<String>(HttpStatus.OK);

我的测试应用

@SpringBootApplication
public class App 
public String httpPut(String urlStr)  
  MyObject myObject = new MyObject(p,p,....);
  URI url = null;
  HttpEntity<MyObject> requestEntity;

  RestTemplate rest = new RestTemplate();
  rest.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

  HttpHeaders headers = new HttpHeaders();

  List<MediaType> list = new ArrayList<MediaType>();
  list.add(MediaType.APPLICATION_JSON);
  headers.setAccept(list);
  headers.setContentType(MediaType.APPLICATION_JSON);
  headers.add("Content-Type", "application/json");

  requestEntity = new HttpEntity<Transaction>(t, headers);

   ResponseEntity<String> response =
                rest.exchange(url, HttpMethod.PUT, requestEntity, MyObject.class);

       return response.getStatusCode().getValue();

我收到了HttpClientErrorException: 400 Bad Request 我的错误在哪里?我想要的是让 Spring 自动序列化 MyObject。 MyObject 类正在实现可序列化。 我错过了什么?

【问题讨论】:

!!!上面发布的代码中的一个错误:requestEntity = new HttpEntity(t, headers); t 是 myObject 对象 当你调用 rest.exchange(..) .. 时,url 仍然为空。 抱歉,忘记复制我正在初始化 URL 的行。到目前为止我找到的解决方案是手动编写类来将 MyObject 序列化为 JSON 并反序列化它。但我想知道是否有办法让 srping-boot 和 spring 模板仅通过注释来处理所有这些 你没有发送任何东西。您期望 MyObject 类作为返回值,但您什么也没有发送(如果您发送的是 Transaction 对象,而不是 MyObject。)。你也做了很多,Spring boot 已经配置了你只需要注入它们并创建一个RestTemplate 的转换器。所以你的代码是复杂和错误的。 【参考方案1】:

也许你做的太多了?

您是否尝试通过邮递员或类似的方式将对象作为 json?如果有,反应如何?

尽管如此,我还是创建了一个通过 Springs RestTemplate 使用服务的最小示例。

这是获取自定义对象并通过 RestTemplate 放置自定义对象所需的全部代码

public void doTransfer()

    String url = "http://localhost:8090/greetings";


    RestTemplate restTemplate = new RestTemplate();

    ResponseEntity<Greeting> greeting = restTemplate.getForEntity(url, Greeting.class);
    LOGGER.info(greeting.getBody().getValue());


    Greeting myGreeting = new Greeting();
    myGreeting.setValue("Hey ho!");
    HttpEntity<Greeting> entity = new HttpEntity<Greeting>(myGreeting);
    restTemplate.exchange(url, HttpMethod.PUT, entity, Greeting.class);


我在Github上提供了一个示例项目,其中包含一个发送者(可能不是一个好名字.. 它是带有问候端点的项目)和一个接收者(使用问候端点的项目)

【讨论】:

【参考方案2】:

尝试这样做:

ResponseEntity<MyObject> responseSerialized =
                rest.exchange(url, HttpMethod.PUT, requestEntity, MyObject.class);

【讨论】:

以上是关于RestTemplate put请求,参数传递不进去的主要内容,如果未能解决你的问题,请参考以下文章

Java RestTemplate post请求传递参数遇到的坑

使用RestTemplate在代码内调用POST请求的参数乱码问题

restTemplate.postForObject接口请求

resttemplate 请求方式详解

RestTemplate发送json请求

RestTemplate 发送 get 请求使用误区 多个参数传值为null(转载)