标签: resttemplate

如何从RestTemplate中读取响应头?

我使用RestTemplate.postForObject将信息发布到Web服务.除了结果字符串,我还需要响应头中的信息.有没有办法得到这个?

RestTemplate template = new RestTemplate();
String result = template.postForObject(url, request, String.class);
Run Code Online (Sandbox Code Playgroud)

java spring resttemplate

32
推荐指数
2
解决办法
4万
查看次数

WebClient与RestTemplate

按照春季5:

WebClient是表示执行Web请求的主要入口点的接口.

它已作为Spring Web Reactive模块的一部分创建,并将在这些场景中替换经典的RestTemplate.新客户端是一种通过HTTP/1.1协议工作的反应式非阻塞解决方案

这是否意味着,如果我们想要升级到Spring 5,我们需要使用RestTemplate重新编码旧应用程序?

或者在Spring 5中使用RestTemplate有一些解决方法?

spring reactive-programming web-client resttemplate

31
推荐指数
5
解决办法
2万
查看次数

如何使用RestTemplate脱机进行单元测试?

我有一个直接依赖于RestTemplate的类.我希望我有离线的JUnit测试.

我怎么能在我的单元测试中模拟RestTemplate?

java junit spring unit-testing resttemplate

30
推荐指数
3
解决办法
2万
查看次数

带有Header的Spring RestTemplate postForObject:webservice找不到我的头参数

我正在与RestTemplate斗争.我需要将一些身份验证信息发送到其他Web服务.我可以发送请求,我会收到回复.但根据响应我的标题参数没有通过.(使用SOAPUI发送相同的请求工作正常)

这是我的代码:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.add("companyId", companyId);
headers.add("password", password);              

HttpEntity<String> request = new HttpEntity<String>(headers);

RestTemplate restTemplate = new RestTemplate();

List<HttpMessageConverter<?>> messageConverters = new  ArrayList<HttpMessageConverter<?>>();
messageConverters.add(new MappingJacksonHttpMessageConverter());           
restTemplate.setMessageConverters(messageConverters);

LoginResponse response = (LoginResponse)restTemplate.postForObject(url, request, LoginResponse.class);
Run Code Online (Sandbox Code Playgroud)

谁能告诉我HttpEntity或HttpHeader有什么问题?

谢谢.

解决了:

好的,终于搞定了.

MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("companyId", companyId);
map.add("password", password);  

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);      

HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);

List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
messageConverters.add(new MappingJacksonHttpMessageConverter());    
messageConverters.add(new FormHttpMessageConverter());
restTemplate.setMessageConverters(messageConverters);

LoginResponse response = (LoginResponse) restTemplate.postForObject(url, …
Run Code Online (Sandbox Code Playgroud)

java spring resttemplate

30
推荐指数
1
解决办法
8万
查看次数

Spring RestTemplate调用带有错误的webservice并分析状态代码

如果请求参数正常,我设计了一个web服务来执行任务,如果请求参数错误或为空,我会返回401 Unauthorized HTTP状态代码.

我正在使用RestTemplate执行测试,如果webservice成功回复,我就能验证HTTP 200 OK状态.但是,我无法测试HTTP 401错误,因为RestTemplate它本身会抛出异常.

我的测试方法是

@Test
public void testUnauthorized()
{
    Map<String, Object> params = new HashMap<String, Object>();
    ResponseEntity response = restTemplate.postForEntity(url, params, Map.class);
    Assert.assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode());
    Assert.assertNotNull(response.getBody());
}
Run Code Online (Sandbox Code Playgroud)

异常日志是

org.springframework.web.client.HttpClientErrorException: 401 Unauthorized
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:88)
at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:533)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:489)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:447)
at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:318)
Run Code Online (Sandbox Code Playgroud)

我如何测试webservice是否回复了HTTP状态码401?

rest spring-mvc http-status-code-401 resttemplate

30
推荐指数
4
解决办法
5万
查看次数

REST客户端restTemplate无法获取对象集合

我使用Spring restTemplate.我在单独的应用程序中将REST服务和客户端作为单元测试.我有返回用户列表的方法和用户创建方法:

@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON,
        MediaType.TEXT_XML })
@Path("/all")
public Response getAllUsers() {
    List<User> list = dao.getAll();
    GenericEntity<List<User>> result = new GenericEntity<List<User>>(list) {
    };
    return Response.status(Status.OK).entity(result).build();
}
Run Code Online (Sandbox Code Playgroud)

如果我要求在浏览器中向我显示所有用户,它会向我显示xml.没关系.但是,当我尝试使用它时:

@Test
public void testGetAll() {
    List list = new RestTemplate().getForObject(URL + "all", List.class);
    System.out.println(list);
}
Run Code Online (Sandbox Code Playgroud)

我有

WARNING: GET request for "http://localhost:8080/REST/all" resulted in 500 (Internal Server Error); invoking error handler
Run Code Online (Sandbox Code Playgroud)

我试着调试这个.方法工作期间没有例外.浏览器向我展示了用户的xml.有什么不对?

另外,我想知道,如何从模板对象中获取状态代码或消息(用于测试)?

谢谢你的回答.

编辑:

我修改了我的测试方法:

@Test
public void testGetAll() {
    RestTemplate template = new RestTemplate();

    List<HttpMessageConverter<?>> messageConverters = new    ArrayList<HttpMessageConverter<?>>();
    Jaxb2RootElementHttpMessageConverter jaxbMessageConverter …
Run Code Online (Sandbox Code Playgroud)

java collections rest spring resttemplate

30
推荐指数
4
解决办法
6万
查看次数

ClassCastException:RestTemplate返回List <LinkedHashMap>而不是List <MymodelClass>

我正在尝试访问MyModelClass上的getter方法,但我的代码返回List<LinkedHashMap>而不是List<MyModelClass>.这是我的代码.

List<MyModelClass> myModelClass=(List<MyModelClass>) restTemplate.postForObject(url,mvm,List.class);

System.out.println("Response= " +  myModelClass);
Run Code Online (Sandbox Code Playgroud)

我试图打印响应,我得到了我期待的JSON响应.但是当我试图运行这段代码时.

System.out.println("Response= " +  myModelClass.get(0).getMessage());
Run Code Online (Sandbox Code Playgroud)

它会产生这个错误.

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.XXX.XXX.MyModelClass 
Run Code Online (Sandbox Code Playgroud)

这是不匹配的.有人可以帮我摆脱这个错误吗?谢谢.

MyModelClass

public class MyModelClass{

    /**
     * 
     */
    @JsonProperty("id")
    public String id;

    @JsonProperty("type")
    public String type;

    @JsonProperty("user")
    public String user;

    @JsonProperty("message")
    public String message;

    //getters
Run Code Online (Sandbox Code Playgroud)

错误

MyModelClass[] myModelClass= restTemplate.postForObject(url,mvm, myModelClass[].class);
Run Code Online (Sandbox Code Playgroud)

org.springframework.http.converter.HttpMessageNotReadableException:无法读取JSON:无法从START_OBJECT令牌中反序列化java.util.ArrayList的实例

JSON响应结构

    [{"key1":"value1","key2":"value2","parameters":{"key1":"value1","key2":"value2","key3":"value3","key4":"value4","key5":"value5"}},
{"key12":"value12","key22":"value22","parameters":{"key12":"value12","key22":"value22","key32":"value32","key42":"value42","key52":"value52"}}]
Run Code Online (Sandbox Code Playgroud)

如果有任何关于如何在RestTemplate中映射这种JSON响应的建议,那将会有很大帮助.谢谢

java spring android classcastexception resttemplate

29
推荐指数
1
解决办法
3万
查看次数

RestTemplate - 处理异常中的响应头/主体(RestClientException,HttpStatusCodeException)

在我的restful webservice中,如果出现错误请求(5xx)或4xx respose代码,我会在响应中写一个自定义标题"x-app-err-id".

在客户端,我使用RestTemplate的交换方法来进行RestFul Web服务调用.当响应代码为2xx时,一切都很好.

ResponseEntity<Component> response = restTemplate.exchange(webSvcURL,
    HttpMethod.POST, 
    requestEntity,
    Component.class);
Run Code Online (Sandbox Code Playgroud)

但是如果有异常(HttpStatusCodeException),因为它是一个错误的请求(5xx)或4xx,在HttpStatusCodeException的catch块中,我得到响应(见上文)为null,所以我没有访问我的自定义头我在我的网络服务中设置.如果RestTemplate中存在异常,如何从响应中获取自定义标头.

还有一个问题是,我在错误的情况下在响应体中设置了一个错误对象(json),我想知道如何在RestTemplate中出现异常时访问响应体

response resttemplate

28
推荐指数
2
解决办法
4万
查看次数

使用RestTemplate获取InputStream

我正在使用URL类从中读取InputStream.有什么方法可以使用RestTemplate吗?

InputStream input = new URL(url).openStream();
JsonReader reader = new JsonReader(new InputStreamReader(input, StandardCharsets.UTF_8.displayName())); 
Run Code Online (Sandbox Code Playgroud)

我如何InputStream 使用RestTemplate而不是使用URL

java inputstream resttemplate

28
推荐指数
6
解决办法
3万
查看次数

Spring MVC - http 404发生时的RestTemplate启动异常

我有一个休息服务,当找不到资源时发送404错误.这里是我的控制器的源代码和发送Http 404的异常.

@Controller
@RequestMapping("/site")
public class SiteController
{

    @Autowired
    private IStoreManager storeManager;

    @RequestMapping(value = "/stores/{pkStore}", method = RequestMethod.GET, produces = "application/json")
    @ResponseBody
    public StoreDto getStoreByPk(@PathVariable long pkStore) {       
        Store s = storeManager.getStore(pkStore);
        if (null == s) {
            throw new ResourceNotFoundException("no store with pkStore : " + pkStore);
        }
        return StoreDto.entityToDto(s);       

    }
}

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException
{       
    private static final long serialVersionUID = -6252766749487342137L;    
    public ResourceNotFoundException(String message) {
        super(message);
    }    
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用此代码使用RestTemplate调用它时:

ResponseEntity<StoreDto> r = restTemplate.getForEntity(url, …
Run Code Online (Sandbox Code Playgroud)

rest spring resttemplate

27
推荐指数
4
解决办法
4万
查看次数