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

RestTemplate GET request抛出400个错误请求

马德宇
2023-03-14

当我从JUnit测试用例向Rest服务发送请求时,我收到了400个坏请求。我的密码。错误日志快结束了。请帮我解决这个问题。当我通过直接在URL中传递参数来调用服务器为:restTemplate.getForObject(BASE_URL+“/Remote?ServiceName=SimpleService&Source=Web”,HelloWorld.Class)时,不会出现任何错误。但如何通过使用地图,这是问题来了。

我的控制器:

@Controller
@RequestMapping("/remote")

public class RESTController implements IController{

@RequestMapping(method = RequestMethod.GET, headers = "Accept=application/xml,  application/json")
public @ResponseBody HelloWorld getMessage(@RequestParam("serviceName") String serviceName, @RequestParam("source") String source) throws ApplicationException{
    System.out.println("got the request:");
    serviceLocator serviceLocator = new serviceLocator();
    HelloWorld helloWorld = new HelloWorld();
    helloWorld.setMessage(serviceLocator.getMessage(serviceName));
    return helloWorld;
}

我的配置:

<context:annotation-config />

<context:component-scan base-package="com" />

<mvc:annotation-driven />

<bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.FormHttpMessageConverter" />
            <bean
                class="org.springframework.http.converter.StringHttpMessageConverter" />
            <bean id="jsonViewResolver"
                class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                <property name="objectMapper" ref="JacksonObjectMapper" />
                <property name="supportedMediaTypes">
                    <list>
                        <bean class="org.springframework.http.MediaType">
                            <constructor-arg value="application" />
                            <constructor-arg value="json" />
                            <constructor-arg
                                value="#{T(java.nio.charset.Charset).forName('UTF-8')}" />
                        </bean>
                    </list>
                </property>
            </bean>

        </list>
    </property>
</bean>
<bean id="JacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" />

我的控制器测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("applicationContextTest.xml")
public class RESTControllerTest {

private static final String BASE_URL = "http://localhost:8080/SimpleServiceWeb/rest";

@Autowired
private RestTemplate restTemplate;

@Test
public void getMessage() throws Exception { 

    String expected = "Hello Spring!";
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setAccept(Collections
            .singletonList(MediaType.APPLICATION_XML));     

    MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
    map.add("serviceName", "simpleService");
    map.add("source", "WEB");

    ObjectMapper mapper = new ObjectMapper();
    ObjectWriter normalWriter = mapper.writer();
    String jsonString = normalWriter.writeValueAsString(map);;
    HttpEntity<Object> requestEntity = new HttpEntity<Object>(httpHeaders);     

    HelloWorld helloWorld = restTemplate.exchange(BASE_URL + "/remote",
             HttpMethod.GET, requestEntity, HelloWorld.class, map) .getBody();

    assertThat(helloWorld.getMessage(), is(expected));
}
<mvc:annotation-driven />

<bean id="springServiceLocator" class="com.servicelocator.simple.SpringServiceLocator">
    <property name="simpleService" ref="simpleService" />
</bean>

<bean id="simpleService" class="com.service.simple.SimpleService" />

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">

    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.FormHttpMessageConverter" />
            <bean
                class="org.springframework.http.converter.StringHttpMessageConverter" />
            <bean id="jsonViewResolver"
                class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                <property name="objectMapper" ref="JacksonObjectMapper" />
                <property name="supportedMediaTypes">
                    <list>
                        <bean class="org.springframework.http.MediaType">
                            <constructor-arg value="application" />
                            <constructor-arg value="json" />
                            <constructor-arg
                                value="#{T(java.nio.charset.Charset).forName('UTF-8')}" />
                        </bean>
                    </list>
                </property>
            </bean>

        </list>
    </property>
</bean>
<bean id="JacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" />

<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient">
    <constructor-arg ref="httpClientParams" />
</bean>

<bean id="httpClientParams" class="org.apache.commons.httpclient.params.HttpClientParams">

    <property name="connectionManagerClass"
        value="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager" />
</bean>

<bean id="httpClientFactory"
    class="org.springframework.http.client.CommonsClientHttpRequestFactory">
    <constructor-arg ref="httpClient" />
</bean>

共有1个答案

阴宏爽
2023-03-14
  1. 您的控制器接受application/xml和application/json类型。
  2. 仅在messageConverters中配置了JSON转换器,我没有看到任何XML转换器。
  3. 在测试用例中,您将媒体类型设置为application/xml。

是否由于缺少xml转换器,Spring无法适当地封送您的请求,因此给出了400?但是,正如控制器中提到的,媒体类型是受支持的,这就是为什么您没有得到415的原因。

 类似资料:
  • 问题内容: 我只是使用a 从这样的用户那里获取最新的tweet: 这在我的本地主机上运行良好,但是当我将其上传到服务器时会引发以下错误: 警告: file_get_contents(http://api.twitter.com/1/statuses/user_timeline/User.json)[function.file- get-contents]:无法打开流:HTTP请求失败!HTTP /

  • 我尝试发送一个删除请求到我的服务器,但我得到一个400坏的请求错误代码。我找了很多,但我找不到任何有帮助解决方案。当我尝试与邮差,请求工作良好。 这是来自Postman的curl命令的外观: 这是我的Java代码: 我还尝试在头中不设置Content-Type,但当我得到一个415错误时,我还删除了getBodyContentType()方法,但这也没有改变。 还有什么能帮上忙的点子吗?

  • 我有一个Rest后的电话。每当我尝试使用邮递员打电话时,它都工作正常。但是如果我使用JerseyAPI客户端尝试相同的帖子调用。我收到400个错误请求 字符串URI=“rest URI”; 如果我使用上述输入在Postman中运行相同的请求,我可以成功命中api并获得200,但在JerseyAPI中获得400

  • 我正在RestTemplate中使用exchange for GET方法。但是在exchange方法中传递requestEntity时,我得到了400个错误的请求。下面是我正在使用的代码。 生成URL: 我尝试从postman访问producer URL,其标题为Content-Type:Application/JSON,正文为{“firstName”:“a”,“lastName”:“b”,“da

  • 我正在使用实现一个联系人应用程序。现在,我正试图通过发送以下格式的put请求来更新联系人 我将XML作为字符串发送,作为请求的主体。这是我的xmlString(请求主体) 我写了下面的代码来发送更新联系人的PUT请求。 当我试图在中发送请求时,联系人更新成功。但是当我试图运行上面的程序时,我得到了 400错误请求错误 我不知道我哪里出错了。任何帮助都将不胜感激!

  • 我正在为一个项目使用Hackerrank API。查看官方文档,点击这里! 在他们的网站上有一个使用UNIREST的例子, 由于我使用的是axios,所以我将其转换为类似的axios代码,如下所示: 我希望这只适用于示例中所示的示例,但它给我带来了以下错误: 请求失败,状态代码为400 错误:请求失败,状态代码为400 在createError(createError.js:16) 在sett(s