前端发送请求,后端没有接收到的可能原因
★梦之蓝★ 2024-09-08 14:03:10 阅读 67
练手的项目,没有学Spring,所以踩坑了。前端用Java Swing图形界面窗口来写的,后端用的Springboot。
出现的问题:写代码的时候发送的请求,后端总是返回请求失败。查了很久,没想到是请求方法不匹配造成的。代码片段如下,主要功能就是:前端给删除按钮添加一个鼠标点击时间,发送请求后,后端把数据库的对应id的数据给删掉。
这里使用了自己写的(抄的)GetUtils工具类创建http请求,但注意这里使用的是Get方法。而导致上述问题的原因就是在后端的Controller层注解用的@DeleteMapping(“/deleteStudentById”),实际上应该用@GetMapping(“/deleteStudentById”),因为我的项目中还是要返回一个操作成功的信息给前端的。
<code>deleteBtn.addActionListener(new ActionListener() { -- -->
@Override
public void actionPerformed(ActionEvent e) {
//获取选中的条目
int selectedRow = table.getSelectedRow();//如果有选中的条目,则返回条目的行号,如果没有选中,那么返回-1
if (selectedRow==-1){
JOptionPane.showMessageDialog(jf,"请选择要删除的条目!");
return;
}
//防止误操作
int result = JOptionPane.showConfirmDialog(jf, "确认要删除选中的条目吗?", "确认删除", JOptionPane.YES_NO_OPTION);
if (result != JOptionPane.YES_OPTION){
return;
}
String id = tableModel.getValueAt(selectedRow, 0).toString();
//这里用的Get方法
GetUtils.get("http://localhost:8080/test/deleteStudentById?id=" + id, new SuccessListener() {
@Override
public void success(String result) {
ResultInfo info = JsonUtils.parseResult(result);
if (info.isFlag()){
//删除成功
JOptionPane.showMessageDialog(jf,"删除成功");code>
requestData();
}else{ -- -->
//删除失败
JOptionPane.showMessageDialog(jf,info.getMessage());
}
}
}, new FailListener() {
@Override
public void fail() {
JOptionPane.showMessageDialog(jf,"网络异常,请稍后重试");
}
});
}
});
下面是我的Controller层的一些接口,这里@GetMapping(“/deleteStudentById”)的注解原本写成了@DeleteMapping(“/deleteStudentById”),所以前后端没有匹配上。
package com.guo.getscreen.controller;
import com.guo.getscreen.dao.ResultInfo;
import com.guo.getscreen.dao.Test;
import com.guo.getscreen.dto.TestDTO;
import com.guo.getscreen.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private TestService testService;
@GetMapping("/findStudentById")
public ResultInfo getStudentById(@RequestParam long id){
// return Response.newSuccess(testService.getStudentById(id));
return new ResultInfo(true,testService.getStudentById(id),"查询成功");
}
@GetMapping("/deleteStudentById")
public ResultInfo deleteStudentById(@RequestParam long id){
System.out.println("Request received to delete student with ID: " + id);
testService.deleteStudentById(id);
return new ResultInfo(true, null, "删除成功");
}
@PutMapping("/updateStudent/{id}")
public Response<TestDTO> updateStudent(@PathVariable long id,
@RequestParam(required = false) String name,
@RequestParam(required = false) String email,
@RequestParam(required = false) String password){
return Response.newSuccess(testService.updateStudentById(id, name, email,password));
}
@GetMapping("/findAllStudents")
public ResultInfo findAllStudents(){
return new ResultInfo(true,testService.findAll(),"查询成功");
}
@PostMapping("/addNewStudent")
public ResultInfo addNewStudent( Test test){
testService.addNewStudent(test);
return new ResultInfo(true,null,"添加成功");
}
}
其他注意事项:
前后端接口不匹配还有一些可能的原因,这里也作为搜集整理如下:
1.URL不匹配。前端URL上请求的接口写错了字母导致与后端不匹配,或者使用的注解不匹配
2. 后端没有启动,没有监听成功。
上面使用的GetUtils类的代码也附在下面:
package com.guo.getscreenui.net;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class GetUtils {
//无参方式
public static void get(String url,SuccessListener sListener,FailListener fListener) {
getWithParams(url, new HashMap<>(),sListener,fListener);
}
//有参方式
public static void getWithParams(String url, Map<String, Object> params,SuccessListener sListener,FailListener fListener) {
CloseableHttpClient httpClient = HttpClientBuilder.create().setDefaultCookieStore(CookiesHolder.getCookieStore()).build();
CloseableHttpResponse response = null;
try {
// 创建Get请求
url = joinParam(url, params);
HttpGet httpGet = new HttpGet(url);
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(3000) //服务器响应超时时间
.setConnectTimeout(3000) //连接服务器超时时间
.build();
httpGet.setConfig(requestConfig);
// 由客户端执行(发送)Get请求
response = httpClient.execute(httpGet);
// 从响应模型中获取响应实体
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
sListener.success(EntityUtils.toString(responseEntity));
}
} catch (Exception e) {
e.printStackTrace();
fListener.fail();
} finally {
try {
// 释放资源
if (httpClient != null) {
httpClient.close();
}
if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static String joinParam(String url, Map<String, Object> params) {
if (params == null || params.size() == 0) {
return url;
}
StringBuilder urlBuilder = new StringBuilder(url);
urlBuilder.append("?");
int counter = 0;
for (Map.Entry<String,Object> entry : params.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (key == null) {
continue;
}
if (counter == 0) {
urlBuilder.append(key).append("=").append(value);
} else {
urlBuilder.append("&").append(key).append("=").append(value);
}
counter++;
}
return urlBuilder.toString();
}
}
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。