有没有好的java自学网站?java自学资料
更新时间:2021-12-04 15:12
最满意答案
定义一个简单的restful接口 @RestController public class TestController { @RequestMapping(value = "testPost", method = RequestMethod.POST) public ResponseBean testPost(@RequestBody RequestBean requestBean) { ResponseBean responseBean = new ResponseBean(); responseBean.setRetCode("0000"); responseBean.setRetMsg("succ"); return responseBean; } } 使用RestTemplate访问该服务 //请求地址 String url = ""; //入参 RequestBean requestBean = new RequestBean(); requestBean.setTest1("1"); requestBean.setTest2("2"); requestBean.setTest3("3"); RestTemplate restTemplate = new RestTemplate(); ResponseBean responseBean = restTemplate.postForObject(url, requestBean, ResponseBean.class); 从这个例子可以看出,使用restTemplate访问restful接口非常的简单粗暴无脑。(url, requestMap, ResponseBean.class)这三个参数分别代表 请求地址、请求参数、HTTP响应转换被转换成的对象类型。 RestTemplate方法的名称遵循命名约定,第一部分指出正在调用什么HTTP方法,第二部分指示返回的内容。本例中调用了restTemplate.postForObject方法,post指调用了HTTP的post方法,Object指将HTTP响应转换为您选择的对象类型。还有其他很多类似的方法,有兴趣的同学可以参考官方api。 三.手动指定转换器(HttpMessageConverter) 我们知道,调用reseful接口传递的数据内容是json格式的字符串,返回的响应也是json格式的字符串。然而restTemplate.postForObject方法的请求参数RequestBean和返回参数ResponseBean却都是java类。是RestTemplate通过HttpMessageConverter自动帮我们做了转换的操作。 默认情况下RestTemplate自动帮我们注册了一组HttpMessageConverter用来处理一些不同的contentType的请求。 如StringHttpMessageConverter来处理text/plain;MappingJackson2HttpMessageConverter来处理application/json;MappingJackson2XmlHttpMessageConverter来处理application/xml。 你可以在org.springframework.http.converter包下找到所有spring帮我们实现好的转换器。 如果现有的转换器不能满足你的需求,你还可以实现org.springframework.http.converter.HttpMessageConverter接口自己写一个。详情参考官方api。 选好了HttpMessageConverter后怎么把它注册到我们的RestTemplate中呢。 RestTemplate restTemplate = new RestTemplate(); //获取RestTemplate默认配置好的所有转换器 List> messageConverters = restTemplate.getMessageConverters(); //默认的MappingJackson2HttpMessageConverter在第7个 先把它移除掉 messageConverters.remove(6); //添加上GSON的转换器 messageConverters.add(6, new GsonHttpMessageConverter()); 这个简单的例子展示了如何使用GsonHttpMessageConverter替换掉默认用来处理application/json的MappingJackson2HttpMessageConverter。 四.设置底层连接方式 要创建一个RestTemplate的实例,您可以像上述例子中简单地调用默认的无参数构造函数。这将使用java.NET包中的标准Java类作为底层实现来创建HTTP请求。 但很多时候我们需要像传统的HttpClient那样设置HTTP请求的一些属性。RestTemplate使用了一种很偷懒的方式实现了这个需求,那就是直接使用一个HttpClient作为底层实现...... //生成一个设置了连接超时时间、请求超时时间、异常最大重试次数的httpClient RequestConfig config = RequestConfig.custom().setConnectionRequestTimeout(10000).setConnectTimeout(10000).setSocketTimeout(30000).build(); HttpClientBuilder builder = HttpClientBuilder.create().setDefaultRequestConfig(config).setRetryHandler(new DefaultHttpRequestRetryHandler(5, false)); HttpClient httpClient = builder.build(); //使用httpClient创建一个ClientHttpRequestFactory的实现 ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); //ClientHttpRequestFactory作为参数构造一个使用作为底层的RestTemplate RestTemplate restTemplate = new RestTemplate(requestFactory); 五.设置拦截器(ClientHttpRequestInterceptor) 有时候我们需要对请求做一些通用的拦截设置,这就可以使用拦截器进行处理。拦截器需要我们实现org.springframework.http.client.ClientHttpRequestInterceptor接口自己写。 举个简单的例子,写一个在header中根据请求内容和地址添加令牌的拦截器。 public class TokenInterceptor implements ClientHttpRequestInterceptor { @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { //请求地址 String checkTokenUrl = request.getURI().getPath(); //token有效时间 int ttTime = (int) (System.currentTimeMillis() / 1000 + 1800); //请求方法名 POST、GET等 String methodName = request.getMethod().name(); //请求内容 String requestBody = new String(body); //生成令牌 此处调用一个自己写的方法,有兴趣的朋友可以自行google如何使用ak/sk生成token,此方法跟本教程无关,就不贴出来了 String token = TokenHelper.generateToken(checkTokenUrl, ttTime, methodName, requestBody); //将令牌放入请求header中 request.getHeaders().add("X-Auth-Token",token); return execution.execute(request, body); } } 创建RestTemplate实例的时候可以这样向其中添加拦截器 RestTemplate restTemplate = new RestTemplate(); //向restTemplate中添加自定义的拦截器 restTemplate.getInterceptors().add(new TokenInterceptor());
其他回答
一、css代码的次序不对 或许在你的印象中,css是无序的,可以随意掺插,其实这种想法是错误的。如果你的css代码含有多个相同的属性,但每一个属性都有不同的值,那么浏览器会选择哪个呢?譬如: body{background-color:red} body{background-col...
相关问答
更多-
resttemplate怎么获取header[2023-05-27]
定义一个简单的restful接口 @RestController public class TestController { @RequestMapping(value = "testPost", method = RequestMethod.POST) public ResponseBean testPost(@RequestBody RequestBean requestBean) { ResponseBean responseBean = new ResponseBean(); responseBea ... -
Spring RestTemplate 使用问题。[2022-04-19]
直接取就OK. List goodsList = restTemplate.getForObject(url, List.class); 参考: http : / / thekspace.com/home/ component/content/article/57-restful-clients-in-spring-3.html -
Spring RestTemplate无法获取JSESSIONID cookie(Spring RestTemplate unable to get JSESSIONID cookie)[2023-06-25]
我已使用以下StatefulRestTemplate修复了该问题 I have fixed the issue with a following StatefulRestTemplate -
如何在Spring RestTemplate请求上设置“Accept:”头?(How to set an “Accept:” header on Spring RestTemplate request?)[2023-06-04]
我建议使用接受HttpEntity的exchange方法之一,您也可以设置HttpHeaders 。 (您也可以指定要使用的HTTP方法。) 例如 RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); HttpEntityentity = ne ... -
在Spring RestTemplate GET调用上设置自定义标题(Setting custom header on Spring RestTemplate GET call)[2022-04-07]
尝试这样的事情 HttpHeaders createHeaders(String username, String password){ 返回新的HttpHeaders(){{ String auth = username +“:”+ password; byte [] encodedAuth = Base64.encodeBase64( auth.getBytes(Charset.forName(“US-ASCII”))); String authHeader =“Basic”+ new String( ... -
您不需要为GET方法设置“requestEntity”,请尝试如下代码: public ItemInfo getItemInfo() throws Exception { String url = "http://localhost:8080/api/v1/items?itemIds=abc"; ObjectMapper objectMapper = new ObjectMapper(); ResponseEntity
respons ... -
我用这段代码解决了我的问题: ResponseEntity
response = restTemplate.exchange(url, HttpMethod.POST, request, Login.class); Login login = response.getBody(); HttpHeaders headers = response.getHeaders(); 所以我的结果是在登录中填充的Login对象,我的Headers在标题中。 I solved my problem usin ... -
在尝试了一个小时之后,我找到了一个简单易行的方法。 默认情况下,Json转换器仅支持“ application / json ”。 我们只是覆盖它以支持“ text / plain ”。 MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); // support "text/plain" converter.setSupportedMediaTypes(Arrays.asList ...
-
最常见的原因是您获得的某些XML不符合模型中定义的反序列化规则(或者可能是格式错误的XML)。 其他可能的原因是您的RestTemplate缺少能够处理XML转换的消息转换器。 默认情况下,Spring Boot会配置Jaxb2RootElementHttpMessageConverter ,但只有在类路径中有JAXB2时才应该检查,因此您应该检查项目是否可以使用此依赖项。 您可以使用以下代码打印在RestTemplate中注册的消息转换器以及它们接受的媒体类型: for (HttpMessageConve ...
-
如何从Spring RestTemplate中的Object获取List(How to get List from Object in Spring RestTemplate)[2024-01-19]
试试吧。 这应该工作。 ResponseEntityresponseEntity = restTemplate.getForEntity("localhost:8083/connectors/", String[].class); List object = Arrays.asList(responseEntity.getBody()); 对于简单的情况,上面的代码可以工作,但是当你想要映射复杂的json结构时,理想的是使用ParameterizedTypeRefer ...