Posting JSON to REST API

后端 未结 9 826
-上瘾入骨i
-上瘾入骨i 2020-12-08 08:12

I\'m creating a REST API that will accept JSON requests.

I\'m testing it out using CURL:

curl -i -POST -H \'Accept: application/json\' -d \'{\"id\":1         


        
相关标签:
9条回答
  • 2020-12-08 08:44

    If I recall correctly the Spring docs say that Spring MVC will automatically detect Jackson on the classpath and set up a MappingJacksonHttpMessageConverter to handle conversion to/from JSON, but I think I have experienced situations where I had to manually/explictly configure that converter to get things to work. You may want to try adding this to your MVC config XML:

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            </list>
        </property>
    </bean>
    

    UPDATE: It was this plus properly formatting the JSON being posted, see https://stackoverflow.com/a/10363876/433789

    0 讨论(0)
  • 2020-12-08 08:44

    I had the same problem, which was solved by two changes in my code :

    1. Missing @PathVariable in my method argument, my method didn't have any
    2. Following method in my SpringConfig class since the one I had with handler interceptor was deprecated and giving some issue:

      public RequestMappingHandlerAdapter RequestMappingHandlerAdapter()
      {
          final RequestMappingHandlerAdapter requestMappingHandlerAdapter = new RequestMappingHandlerAdapter();
          final MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter = new MappingJacksonHttpMessageConverter();
          final String[] supportedHttpMethods = { "POST", "GET", "HEAD" };
      
          requestMappingHandlerAdapter.getMessageConverters().add(0, mappingJacksonHttpMessageConverter);
          requestMappingHandlerAdapter.setSupportedMethods(supportedHttpMethods);
      
          return requestMappingHandlerAdapter;
      }
      
    0 讨论(0)
  • 2020-12-08 08:47

    Try adding a descriptor of what's in your POST request. That is, add to curl the header:

    Content-Type: application/json
    

    If you don't add it, curl will use the default text/html regardless of what you actually send.

    Also, in PurchaseController.create() you have to add that the type accepted is application/json.

    0 讨论(0)
  • 2020-12-08 08:52

    Try to add the following code in your app configuration

    <mvc:annotation-driven>
      <mvc:message-converters>
          <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
              <property name="objectMapper" ref="jacksonObjectMapper" />
          </bean>
      </mvc:message-converters>
    

    0 讨论(0)
  • 2020-12-08 08:54

    Here is a unit test solution similar to yoram givon's answer - https://stackoverflow.com/a/22516235/1019307.

    public class JSONFormatTest
    {
        MockMvc mockMvc;
    
        // The controller used doesn't seem to be important though YMMV
        @InjectMocks
        ActivityController controller;  
    
        @Before
        public void setup()
        {
            MockitoAnnotations.initMocks(this);
    
            this.mockMvc = standaloneSetup(controller).setMessageConverters(new MappingJackson2HttpMessageConverter())
                    .build();
        }
    
        @Test
        public void thatSaveNewDataCollectionUsesHttpCreated() throws Exception
        {
            String jsonContent = getHereJSON02();
            this.mockMvc
                    .perform(
                         post("/data_collections").content(jsonContent).contentType(MediaType.APPLICATION_JSON)
                                    .accept(MediaType.APPLICATION_JSON)).andDo(print()).andExpect(status().isCreated());
        }
    
        private String getHereJSON01()
        {
            return "{\"dataCollectionId\":0,\"name\":\"Sat_016\",\"type\":\"httpUploadedFiles\"," ...
        }
    }
    

    Run the unit test and the print() should print out the MockHttpServletRequest including the Exception.

    In Eclipse (not sure about how to do this in other IDEs), click on the Exception link and a properties dialog for that exception should open. Tick the 'enabled' box to break on that exception.

    Debug the unit test and Eclipse will break on the exception. Inspecting it should reveal the problem. In my case it was because I had two of the same entity in my JSON.

    0 讨论(0)
  • 2020-12-08 08:57

    I had the same problem and I resolved it.

    1 add MappingJackson2HttpMessageConverter as described in that thread (see also section 4 http://www.baeldung.com/spring-httpmessageconverter-rest)

    2 use correct command (with escape symbols):

    curl -i -X POST -H "Content-Type:application/json" -d "{\"id\":\"id1\",\"password\":\"password1\"}" http://localhost:8080/user    
    
    0 讨论(0)
提交回复
热议问题