gpt4 book ai didi

java - 如何在 Java Spring Controller 中使用不同的 GET 方法

转载 作者:行者123 更新时间:2023-12-02 02:52:58 24 4
gpt4 key购买 nike

我正在尝试通过 REST Web 服务将数据从数据库检索到移动应用程序。我已经设法制作了一些基本功能,但是当我尝试添加功能时遇到了问题。例如,我希望能够通过 ID 和姓名找到“客户”。当我有两种 Get 方法时,一种使用“/{id}”,另一种使用“/{name}”,应用程序不知道该使用什么。我可以做什么来按名称搜索?这是来自 Web 服务的 Controller 。

package com.example;


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

import java.util.List;

@RestController
@RequestMapping("/customers")
public class CustomerController {
private CustomerRepository repository;

@Autowired
public CustomerController(CustomerRepository repository) {
this.repository = repository;
}

@RequestMapping(value = "/{name}", method = RequestMethod.GET)
public ResponseEntity<Customer> get(@PathVariable("name") String name) {
Customer customer = repository.findByName(name);
if (null == customer) {
return new ResponseEntity<Customer>(HttpStatus.NOT_FOUND);
}
return new ResponseEntity<Customer>(customer, HttpStatus.OK);
}

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public ResponseEntity<Customer> get(@PathVariable("id") Long id) {
Customer customer = repository.findOne(id);
if (null == customer) {
return new ResponseEntity<Customer>(HttpStatus.NOT_FOUND);
}
return new ResponseEntity<Customer>(customer, HttpStatus.OK);*
}

@RequestMapping(value = "/new", method = RequestMethod.POST)
public ResponseEntity<Customer> update(@RequestBody Customer customer) {
repository.save(customer);
return get(customer.getName());
}

@RequestMapping
public List<Customer> all() {
return repository.findAll();
}
}

这是来自 Android 应用程序的服务

package com.ermehtar.poppins;

import java.util.List;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.PATCH;
import retrofit2.http.POST;
import retrofit2.http.Path;

public interface CustomerService {
@GET("customers")
Call<List<Customer>> all();

@GET("customers/{id}")
Call<Customer> getUser(@Path("id") Long id);

@GET("customers/{name}")
Call<Customer> getUser(@Path("name") String name);

@POST("customers/new")
Call<Customer> create(@Body Customer customer);
}

然后这是我用来按名称调用服务的函数。当/name 和/id 函数都在 Web 服务 Controller 中时,response.body 将为 null,但当其中之一被注释掉时,这就可以正常工作。

findUsernameButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Call<Customer> createCall = service.getUser("John");
createCall.enqueue(new Callback<Customer>() {
@Override
public void onResponse(Call<Customer> _, Response<Customer> resp) {
findUsernameButton.setText(resp.body().name);
}

@Override
public void onFailure(Call<Customer> _, Throwable t) {
t.printStackTrace();
allCustomers.setText(t.getMessage());
}
});
}
});

希望我已经让自己能够被理解了。如果有不清楚的地方或者您需要更多信息,请询问。

最佳答案

您的 Restful 设计可以改进。我建议定义这样的内容:

新:

/customers/new

这是不正确的,在restful中资源创建应该由方法类型定义。我建议这样做:

/customers with POST method.

按 ID 搜索:

/customers/{id}

这是正确的,在 Restful 中,资源应该通过 id 使用路径变量来访问。

按名称搜索:

/customers/{name}

这是不正确的,这里您正在查询客户资源,因此,您应该使用查询参数,我建议这样做:

/customers?name=<<name>>

如果您有多种查询方法,则会发生冲突,因为在同一路径的 Controller 中不能有多个 GET 方法。因此,您可以修改 @RequestMapping 以显式断言需要哪些查询参数,如下所示:

@RequestMapping(value = "/", method = RequestMethod.GET, , params = "name")
public ResponseEntity<Customer> getByName(@RequestParam("name") String name) {
...
}

@RequestMapping(value = "/", method = RequestMethod.GET, , params = "lastname")
public ResponseEntity<Customer> getByLastname(@RequestParam("lastname") String lastname) {
...
}

关于java - 如何在 Java Spring Controller 中使用不同的 GET 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43529559/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com