使用Spring RestTemplate将对象作为参数进行POST请求

5
我将尝试使用Spring的RestTemplate功能发送一个POST请求,但是在发送对象时遇到了问题。以下是我用于发送请求的代码:
RestTemplate rt = new RestTemplate();

MultiValueMap<String,Object> parameters = new LinkedMultiValueMap<String,Object>();
parameters.add("username", usernameObj);
parameters.add("password", passwordObj);

MyReturnObj ret = rt.postForObject(endpoint, parameters, MyRequestObj.class);

我还有一个日志拦截器,这样我就可以调试输入参数了,它们几乎正确!目前,usernameObjpasswordObj参数的显示如下:

{"username":[{"testuser"}],"password":[{"testpassword"}]}

我希望它们看起来像以下这样:

username={"testuser"},password={"testpassword"}

假设usernameObjpasswordObj是已经编组成JSON格式的Java对象。
我做错了什么?
2个回答

3

好的,我最终解决了这个问题。我编写了一个marshaller/unmarshaller,以便能够更加微观地处理它。以下是我的解决方案:

RestTemplate rt = new RestTemplate();

// Create a multimap to hold the named parameters
MultiValueMap<String,String> parameters = new LinkedMultiValueMap<String,String>();
parameters.add("username", marshalRequest(usernameObj));
parameters.add("password", marshalRequest(passwordObj));

// Create the http entity for the request
HttpEntity<MultiValueMap<String,String>> entity =
            new HttpEntity<MultiValueMap<String, String>>(parameters, headers);

// Get the response as a string
String response = rt.postForObject(endpoint, entity, String.class);

// Unmarshal the response back to the expected object
MyReturnObj obj = (MyReturnObj) unmarshalResponse(response);

这个解决方案让我能够控制对象的编组/解组,而不是让Spring直接处理对象,仅仅是发送字符串。它非常有帮助!


4
元帅请求的来源在哪里? - Arthur Melo
2
最好在这里放置unmarshalResponse代码并完成您的答案! - Omid Nazifi

1

客户端

要将对象作为JSON字符串传递,请使用MappingJackson2HttpMessageConverter

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

对于服务器端的Spring配置

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jsonMessageConverter"/>
        </list>
    </property>
</bean>
<bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>

1
谢谢回复,但我已经尝试过了,没有成功。正如您所看到的,请求被发送为JSON,但它被包含在一个JSON对象中,该对象的名称等于参数名称。我不希望我的JSON字符串被这样包含。 - Matt Crysler

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