当前位置: 首页 > 知识库问答 >
问题:

在POST方法中向Spring(Jackson)REST控制器发送字符串

韩彬
2023-03-14

我正在尝试使用HTTP Post方法向rest服务发送string对象。并且字符串应该在请求正文中发送。

@RestController
@RequestMapping(value = "post", method = RequestMethod.POST)
public class HttpMethodPostController {

    /*HttpClientErrorException: 415 null*/
    @RequestMapping(value = "/string_as_text", consumes = MediaType.TEXT_PLAIN_VALUE)
    public ResponseEntity<Void> getStringAsText(@RequestBody String text) {
        System.out.println("[Server] text = " + text);
        return new ResponseEntity<Void>(HttpStatus.OK);
    }

    /*HttpClientErrorException: 400 null*/
    @RequestMapping(value = "/string_as_json", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public ResponseEntity<Void> getStringAsJSON(@RequestBody String text) {
        System.out.println("[Server] text = " + text);
        return new ResponseEntity<Void>(HttpStatus.OK);
    }

    @RequestMapping(value = "/type1_", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public ResponseEntity<Void> postType1_(@RequestBody Type1_ type1_) {
        System.out.println("[Server] type1_ = " + type1_);
        return new ResponseEntity<Void>(HttpStatus.OK);
    }

}
public class HttpMethodPostConsumer {
    public static final String POST_ADDRESS = "http://localhost:55055/post";

    /*HttpClientErrorException: 415 null*/
    public static void postStringAsText(String text) {
        final RestTemplate restTemplate = new RestTemplate();
        final HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.TEXT_PLAIN);
        final HttpEntity<String> entity = new HttpEntity<>(text, headers);
        final URI uri = restTemplate.postForLocation(POST_ADDRESS + "/string_as_text", entity, String.class);
        System.out.println("uri = " + uri);
    }

    /*HttpClientErrorException: 400 null*/
    public static void postStringAsJSON(String text) {
        final RestTemplate restTemplate = new RestTemplate();
        final HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        final HttpEntity<String> entity = new HttpEntity<>(text, headers);
        final URI uri = restTemplate.postForLocation(POST_ADDRESS + "/string_as_json", entity, String.class);
        System.out.println("uri = " + uri);
    }

    public static void postType1_(Type1_ type1_) {
        final RestTemplate restTemplate = new RestTemplate();
        final HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        final HttpEntity<Type1_> httpEntity = new HttpEntity<Type1_>(type1_, headers);
        final URI result_URI = restTemplate.postForLocation(POST_ADDRESS + "/type1_", httpEntity, Type1_.class);
        System.out.println("result_URI = " + result_URI);
    }
}
public class HttpMethodPostConsumerTest {

    /*HttpClientErrorException: 415 null*/
    @Test
    public void test_postStringAsText() {
        final String text = Randomizers.getString();
        System.out.println("text = " + text);
        postStringAsText(text);
    }

    /*HttpClientErrorException: 400 null*/
    @Test
    public void test_postStringAsJSON() {
        final String text = Randomizers.getString();
        System.out.println("text = " + text);
        postStringAsJSON(text);
    }

    @Test
    public void test_postType1_() {
        final Type1_ type1_ = ModelFactory.getType1_();
        System.out.println("[Consumer] type1_ = " + type1_);
        postType1_(type1_);
    }

}
    null

在org.springframework.web.client.defaultresponseerrorhandler.handleerror(defaultresponseerrorhandler.java:94)在org.springframework.web.client.defaultresponseerrorhandleerror(defaultresponseerrorhandler.java:79)在org.springframework.web.client.responseerrorhandleerror(responseerrorhandler.java:63)在org.springframework.web.client.resttemplate.handleresponse(resttemplate.java:775)在.springframework.web.client.resttemplate.execute(resttemplate.java:684)在org.springframework.web.client.resttemplate.postforlocation(resttemplate.java:405)在personal.learn.java.spring_rest.rest_general.non_automate.consumers.httpmethodpostconsumer.poststringastext(httpmethodpostconsumer.java:21)在

  • 运行test_poststringasjson()将导致错误
    • 客户端/使用者端错误

    org.springframework.web.client.HttpClientRorexception:400 null

    在org.springframework.web.client.defaultresponseerrorhandler.handleerror(defaultresponseerrorhandler.java:94)在org.springframework.web.client.defaultresponseerrorhandleerror(defaultresponseerrorhandler.java:79)在org.springframework.web.client.responseerrorhandleerror(responseerrorhandler.java:63)在org.springframework.web.client.resttemplate.handleresponse(resttemplate.java:775)在.springframework.web.client.resttemplate.execute(resttemplate.java:684)在org.springframework.web.client.resttemplate.postforlocation(resttemplate.java:405)在personal.learn.java.spring_rest.rest_general.non_automated.consumers.httpmethodpostconsumer.poststringasjson(httpmethodpostconsumer.java:31)在personal.learn.java.spring_rest.rest_general.non_automated.consumers.httpmethodpostconsumertest.test_poststringasjson(

    服务器端错误(控制台中)

    02-may-2018 17:25:45.469警告[http-nio-55055-exec-2]org.springframework.web.servlet.mvc.support.defaultHandlerExceptionResolver.HandleHttpMessageNotReadable无法读取HTTP消息:org.springframework.HTTP.converter.httpMessageNotReadable异常:JSON分析错误:无法识别的令牌“IATQDixtch”:应为“null”、“true”、“false”或NaN;嵌套异常为com.fasterxml.jackson.core.JSONParseException:无法识别的标记“IATQDixtch”:在[Source:(PushbackInputStream);行:1,列:21]处应为“null”、“true”、“false”或NaN

    服务器端错误(在Tomcat Catalina日志中)

共有1个答案

车峻熙
2023-03-14

如果您想要使用@RequestBody发布到您的服务器,那么需要将一个对象发送到您的控制器。

使用字符串参数创建DTO类:

public class ExampleDTO {

 private String stringExample;

  public String getStringExample() {
    return stringExample;
  }

  public void setStringExample(String stringExample) {
    this.stringExample= stringExample;
  }

}

您的控制器:

@RequestMapping(method = RequestMethod.POST, value = "/string_as_text")
public ResponseEntity<Void> getStringAsText(@RequestBody ExampleDTO exampleDTO) {
    System.out.println("[Server] text = " + exampleDTO.getStringExample());
    return new ResponseEntity<Void>(HttpStatus.OK);
}

消费者

ExampleDTO param = new ExampleDTO();
param.setStringExample("text")
 类似资料:
  • 我试图通过AJAX向Spring控制器发送JSON对象,但收到错误415: 下面是我的javascript调用- 这里是我的依赖项杰克逊相关的依赖项在我的POM- 讽刺的是,当我试着穿Spring靴的时候,它就起作用了。

  • 我可以在POST请求时发送对象列表作为响应,并在VueJs客户端中接收它 但是当我尝试用自定义类响应时(我甚至在请求映射注释中添加了) 在axios的帮助下发送VueJs端请求。邮递 Vue用户界面客户端接收 为什么我可以用对象列表响应而不能用POJO响应,以及如何解决这个问题?非常感谢。 PS.项目依赖于jackson-数据库v2.8.2和Spring v4.3.1

  • 我在firefox web Browser中使用Rest Client add on。我想测试一个处理HTTP POST请求并使用JSON的web服务。我如何使用Rest Client测试它? 如果在请求正文中添加json,将得到一个*HTTP 415不受支持的媒体类型错误*。 这样做的正确方法是什么?

  • 我在Java客户端有以下代码,它调用基于Spring的REST服务,我得到一个HTTP 400错误。但它与POST man Client完美配合 Java客户端: 服务器端REST服务代码为 现在,当客户端发送请求时,它会给我http 400错误,这可能是因为在客户端,即时消息发送JSON字符串,而在服务器端,它是一个主体,但这在POST MAN上有效 谁能建议我如何通过Java向基于spring

  • 我正在构建和测试一个简单的Spring Boot API REST教程。我面临着一个我正在努力理解的问题。当调用POST方法来创建并持久化一个新实体时,我得到了一个HTTP 406(不可接受)。 问题是实体被持久化了,但对客户端的响应不是预期的(在本例中,HTTP 201是用URI创建的)。 Tutorial和TutorialDto类具有完全相同的属性。定义如下: 以下是我在@RestContro

  • 我试图将JSON发送到Spring MVC控制器。在Spring MVC方面,所有的配置都是正确的。 下面是代码,但似乎没有运行: 你知道我哪里出错了吗?我对JSON是新手。我试图将JSON发送到Spring MVC控制器。 当调用/application/run/save时,我会得到一个JSON响应。但是,@RequestBody不能工作。 我还是没有运气。读过一些很多类似的问题。需求是服务器将