我使用RestTemplate.postForObject将信息发布到Web服务.除了结果字符串,我还需要响应头中的信息.有没有办法得到这个?
RestTemplate template = new RestTemplate();
String result = template.postForObject(url, request, String.class);
Run Code Online (Sandbox Code Playgroud) 按照春季5:
WebClient是表示执行Web请求的主要入口点的接口.
它已作为Spring Web Reactive模块的一部分创建,并将在这些场景中替换经典的RestTemplate.新客户端是一种通过HTTP/1.1协议工作的反应式非阻塞解决方案
这是否意味着,如果我们想要升级到Spring 5,我们需要使用RestTemplate重新编码旧应用程序?
或者在Spring 5中使用RestTemplate有一些解决方法?
我有一个直接依赖于RestTemplate的类.我希望我有离线的JUnit测试.
我怎么能在我的单元测试中模拟RestTemplate?
我正在与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) 如果请求参数正常,我设计了一个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?
我使用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) 我正在尝试访问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响应的建议,那将会有很大帮助.谢谢
在我的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中出现异常时访问响应体
我正在使用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?
我有一个休息服务,当找不到资源时发送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) resttemplate ×10
spring ×7
java ×6
rest ×3
android ×1
collections ×1
inputstream ×1
junit ×1
response ×1
spring-mvc ×1
unit-testing ×1
web-client ×1