Springboot提供外部接口和访问外部接口的简单例子

1. 创建Spring Boot控制器

首先,我们将创建一个Spring Boot控制器来提供API接口。

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
public class UserController {

    // 假设这里有一个服务来获取用户信息,这里使用模拟数据代替
    private final UserService userService = new UserService();

    @GetMapping("/user")
    public ResponseEntity<?> getUserByMemberNumAndTel(@RequestParam String memberNum, @RequestParam String tel) {
        if (memberNum == null || tel == null || memberNum.trim().isEmpty() || tel.trim().isEmpty()) {
            return ResponseEntity.badRequest().body("Invalid request: memberNum and tel are required");
        }

        User user = userService.findUserByMemberNumAndTel(memberNum, tel);

        if (user == null) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User not found");
        }

        return ResponseEntity.ok().body(new UserResponse(user.getUsername(), user.getEmail(), user.getAddress()));
    }

用户实体类

private static class User {
        private String username;
        private String email;
        private String address;

        public User(String username, String email, String address) {
            this.username = username;
            this.email = email;
            this.address = address;
        }

        // Getters and setters
        public String getUsername() { return username; }
        public String getEmail() { return email; }
        public String getAddress() { return address; }
    }

用户响应类

private static class UserResponse {
        private final String username;
        private final String email;
        private final String address;

        public UserResponse(String username, String email, String address) {
            this.username = username;
            this.email = email;
            this.address = address;
        }

        // Getters
        public String getUsername() { return username; }
        public String getEmail() { return email; }
        public String getAddress() { return address; }
    }

服务接口

private interface UserService {
        User findUserByMemberNumAndTel(String memberNum, String tel);
    }

服务实现类

private static class UserServiceImpl implements UserService {
        @Override
        public User findUserByMemberNumAndTel(String memberNum, String tel) {
            // 这里应该是数据库查询逻辑,这里使用模拟数据
            if ("123456".equals(memberNum) && "1234567890".equals(tel)) {
                return new User("John Doe", "john.doe@example.com", "123 Main St");
            }
            return null;
        }
    }
}

2. 编写访问API的方法

我们将编写一个方法来调用这个API,并处理返回的响应。如果访问超时(30秒),将抛出访问超时的错误。

import org.springframework.web.client.RestTemplate;
import org.springframework.web.client.ResourceAccessException;

public class ApiClient {

    private final RestTemplate restTemplate;

    public ApiClient() {
        this.restTemplate = new RestTemplate();
        // 设置超时时间为30秒
        restTemplate.setRequestFactory(new SimpleClientHttpRequestFactory() {{
            setConnectTimeout(30000);
            setReadTimeout(30000);
        }});
    }

    public UserResponse getUserByMemberNumAndTel(String memberNum, String tel) {
        try {
            ResponseEntity<UserResponse> response = restTemplate.getForEntity(
                    "http://localhost:8080/api/user?memberNum={memberNum}&tel={tel}",
                    UserResponse.class,
                    memberNum,
                    tel
            );

            if (response.getStatusCode() == HttpStatus.OK) {
                return response.getBody();
            } else if (response.getStatusCode() == HttpStatus.BAD_REQUEST) {
                throw new IllegalArgumentException("Invalid request: " + response.getBody());
            } else if (response.getStatusCode() == HttpStatus.NOT_FOUND) {
                throw new RuntimeException("User not found");
            }
        } catch (ResourceAccessException e) {
            throw new RuntimeException("访问超时,请稍后再试", e);
        }
        return null;
    }

    public static void main(String[] args) {
        ApiClient apiClient = new ApiClient();
        try {
            UserResponse userResponse = apiClient.getUserByMemberNumAndTel("123456", "1234567890");

            if (userResponse != null) {
                System.out.println("User Info:");
                System.out.println("Username: " + userResponse.getUsername());
                System.out.println("Email: " + userResponse.getEmail());
                System.out.println("Address: " + userResponse.getAddress());
            } else {
                System.out.println("Failed to retrieve user info.");
            }
        } catch (RuntimeException e) {
            System.out.println(e.getMessage());
        }
    }
}

在这个例子中,ApiClient类有一个方法getUserByMemberNumAndTel,它使用RestTemplate来调用我们之前创建的API。这个方法接受会员账号和电话作为参数,然后发送GET请求到API端点。根据响应的状态码,它将返回用户信息或者抛出异常。

我们设置了RestTemplate的连接超时和读取超时时间为30秒。如果在30秒内没有收到响应,RestTemplate将抛出ResourceAccessException异常,我们捕获这个异常并抛出一个自定义的RuntimeException,提示用户访问超时。

请注意,你需要根据你的实际环境调整RestTemplate的URL,以及处理异常和错误响应的逻辑。这个例子中的main方法是一个简单的测试,用于演示如何调用getUserByMemberNumAndTel方法并打印用户信息。

### 关于Spring Boot CRUD API 文档 在构建基于Spring Boot的应用程序时,创建CRUD(Create, Read, Update, Delete)API是一个常见的需求。通过使用Spring Data JPA简化了这一过程,使得开发者能够专注于业务逻辑而不是数据访问层的具体实现细节。 #### 创建实体类 为了定义数据库中的表结构,在Java项目里通常会先编写对应的实体类。例如下面展示了一个简单的`Answer`实体类[^2]: ```java @Data @Table(name = "answer") public class Answer { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private String id; private String content; @Column(name = "supportcnt") private int supportCnt; @Column(name = "opposecnt") private int opposeCnt; @Column(name = "answerto") private String answerTo; private Date time; @Column(name = "userid") private String userId; /** status用于假删除 */ private int status; } ``` 此代码片段展示了如何利用JPA注解来映射对象属性至关系型数据库字段,并设置了主键自动生成策略以及一些其他列的信息。 #### 定义仓库接口 接着需要为上述实体建立相应的Repository接口以便操作持久化存储的数据。对于基本的CURD功能来说,继承`CrudRepository<T,ID>`就足够了;如果还需要额外的方法,则可以根据实际需求进一步定制查询方法。 ```java import org.springframework.data.repository.CrudRepository; public interface AnswerRepository extends CrudRepository<Answer, Long> {} ``` 有了这个接口之后就可以轻松执行保存新记录、按ID查找单条记录、更新现有记录或移除指定项等基础动作了。 #### 构建REST控制器 最后一步就是搭建Web层即Controller部分,用来接收HTTP请求并将它们转发给服务端内部处理逻辑。这里给出一个简易版的例子说明怎样暴露资源供外部调用: ```java @RestController @RequestMapping("/api/answers") public class AnswerController { @Autowired private AnswerRepository repository; // 获取全部答案列表 @GetMapping("") public Iterable<Answer> getAllAnswers() { return repository.findAll(); } // 添加新的回答 @PostMapping("") public Answer create(@RequestBody Answer newAnswer) { return repository.save(newAnswer); } // 更新特定的回答信息 @PutMapping("/{id}") public ResponseEntity<?> update(@PathVariable(value="id") long id,@Validated @RequestBody Answer details){ Optional<Answer> optional=repository.findById(id); if(!optional.isPresent()){ return ResponseEntity.notFound().build(); } Answer updatedDetails=optional.get(); updatedDetails.setContent(details.getContent()); updatedDetails.setSupportCnt(details.getSupportCnt()); updatedDetails.setOpposeCnt(details.getOpposeCnt()); updatedDetails.setTime(details.getTime()); updatedDetails.setStatus(details.getStatus()); final Answer updatedItem = repository.save(updatedDetails); return ResponseEntity.ok(updatedItem); } // 删除某个具体ID对应的回答 @DeleteMapping("/{id}") public void deleteById(@PathVariable("id")Long id){ repository.deleteById(id); } } ``` 以上便是有关于Spring Boot应用程序中实现CRUD RESTful Web Services的一个简单介绍[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钟小猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值