Showcase Restful Service演示与Shiro集成的HttpBasic安全控制,RestTemplate设置HttpHeaders的写法。

This commit is contained in:
Calvin
2012-09-03 12:19:02 +08:00
parent c4d2c1a76e
commit 62f3c7b057
6 changed files with 72 additions and 42 deletions
@@ -1,21 +0,0 @@
package org.springside.examples.showcase.webservice.rest;
import org.apache.commons.lang3.builder.ToStringBuilder;
public class SimpleTeamDTO {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
@@ -11,7 +11,7 @@ public class UserDTO {
private String loginName;
private String name;
private String email;
private SimpleTeamDTO team;
private Long teamId;
public Long getId() {
return id;
@@ -45,12 +45,12 @@ public class UserDTO {
email = value;
}
public SimpleTeamDTO getTeam() {
return team;
public Long getTeamId() {
return teamId;
}
public void setTeam(SimpleTeamDTO team) {
this.team = team;
public void setTeamId(Long teamId) {
this.teamId = teamId;
}
/**
@@ -19,16 +19,22 @@ public class UserRestController {
@RequestMapping(value = "/{id}.xml", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE)
@ResponseBody
public UserDTO getAs(@PathVariable("id") Long id) {
public UserDTO getAsXml(@PathVariable("id") Long id) {
User user = accountService.getUser(id);
return BeanMapper.map(user, UserDTO.class);
return bindDTO(user);
}
@RequestMapping(value = "/{id}.json", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public UserDTO listasJson(@PathVariable("id") Long id) {
public UserDTO getAsJson(@PathVariable("id") Long id) {
User user = accountService.getUser(id);
return BeanMapper.map(user, UserDTO.class);
return bindDTO(user);
}
private UserDTO bindDTO(User user) {
UserDTO dto = BeanMapper.map(user, UserDTO.class);
//补充Dozer不能自动绑定的属性
dto.setTeamId(user.getTeam().getId());
return dto;
}
}
@@ -26,7 +26,7 @@
/login = authc
/logout = logout
/account/** = user
/rest/users = authcBasic
/api/** = authcBasic
</value>
</property>
</bean>
@@ -12,12 +12,19 @@
</head>
<body>
<h1>Web Service 演示</h1>
<h1>Web Service 演示</h1>
<h2>传统SOAP Web Service演示</h2>
<ul>
<li>服务端是基于CXF的JAX-WS演示. 详见由CXF自动生成的<a href="${ctx}/soap">服务信息及wsdl文件</a>.</li>
<li>客户端见Functional Test用例.</li>
</ul>
<h2>传统SOAP Web Service演示</h2>
<ul>
<li>服务端是基于CXF的JAX-WS演示. 详见由CXF自动生成的<a href="${ctx}/soap">服务信息及wsdl文件</a>.</li>
<li>客户端见Functional Test用例.</li>
</ul>
<h2>Restful Service高级演示</h2>
<ul>
<li>集成Shiro进行HttpBasic的认证</li>
<li>XML与JSON两种格式</li>
<li>RestTemplate设置HttpHeaders的写法</li>
</ul>
</body>
</html>
@@ -4,9 +4,15 @@ import static org.junit.Assert.*;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestTemplate;
import org.springside.examples.showcase.functional.BaseFunctionalTestCase;
import org.springside.examples.showcase.webservice.rest.UserDTO;
import org.springside.modules.web.Servlets;
public class UserRestFT extends BaseFunctionalTestCase {
@@ -19,14 +25,46 @@ public class UserRestFT extends BaseFunctionalTestCase {
resoureUrl = baseUrl + "/api/v1/user";
}
/**
* 演示restTemplate中如何设置Headers.
* 演示json与xml格式数据.
*/
@Test
public void getUser() {
//设置Http Basic参数
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set(com.google.common.net.HttpHeaders.AUTHORIZATION, Servlets.encodeHttpBasic("admin", "admin"));
HttpEntity<?> requestEntity = new HttpEntity(requestHeaders);
//as xml
UserDTO user = restTemplate.getForObject(resoureUrl + "/{id}.xml", UserDTO.class, 1L);
assertEquals("admin", user.getLoginName());
HttpEntity<UserDTO> response = restTemplate.exchange(resoureUrl + "/{id}.xml", HttpMethod.GET, requestEntity,
UserDTO.class, 1L);
assertEquals("admin", response.getBody().getLoginName());
assertEquals(new Long(1), response.getBody().getTeamId());
//as json
user = restTemplate.getForObject(resoureUrl + "/{id}.json", UserDTO.class, 1L);
assertEquals("admin", user.getLoginName());
response = restTemplate.exchange(resoureUrl + "/{id}.json", HttpMethod.GET, requestEntity, UserDTO.class, 1L);
assertEquals("admin", response.getBody().getLoginName());
assertEquals(new Long(1), response.getBody().getTeamId());
}
/**
* 演示restTemplate中如何设置Headers.
* 演示json与xml格式数据.
*/
@Test
public void authWithHttpBasic() {
//设置Http Basic参数
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set(com.google.common.net.HttpHeaders.AUTHORIZATION,
Servlets.encodeHttpBasic("admin", "wrongpassword"));
HttpEntity<?> requestEntity = new HttpEntity(requestHeaders);
try {
restTemplate.exchange(resoureUrl + "/{id}.xml", HttpMethod.GET, requestEntity, UserDTO.class, 1L);
fail("Get should fail with error username/password");
} catch (HttpClientErrorException e) {
assertEquals(HttpStatus.UNAUTHORIZED, e.getStatusCode());
}
}
}