这里写自定义目录标题
利用Springboot做后端,安卓做前端的接收参数问题,直接上代码
##第一次发博客 有错误不恰当之处 还请大家批评指正,是基于okhttp3
// okhttp3网络框架 在你的build.gradle(Moudle)中添加
implementation(“com.squareup.okhttp3:okhttp:4.9.0”)
// android前端
// 请求地址为我springboot作为后端的地址
// 如果小伙伴使用手机或者模拟器都注意两个问题
// 第一 手机连接电脑wifi时,安卓有时候部署项目会出错错误 这时候需要你手机
// 首先断开电脑开的热点,再部署,再连接wifi,再测试
// 第二 如果你手机或者模拟器(因为模拟器很真实 不会认为和你的电脑在一个网络下,因此需要设置模拟器的wifi),使用的自己的网络(没有连接电脑wifi),极大可能不能访问okhttp所发送的请求
// 因为你们不在一个局域网下,因此正确的使用方式
// 是电脑开热点,手机连电脑的热点
// 解释下,我这里使用jsonObject仅仅是为了传入键值对类型参数而已,你也可以更改为map类型的形参,从而自己直接传入map集合,以获取数据
register = OkHttpUtils.register("http://10.8.107.60:8080/register/",jsonObject,getApplication());
// 该方法是自定义OkHttpUtils下的静态方法
public static String register(String url,JSONObject jsonObject,Context context) throws ExecutionException, InterruptedException {
// 存放从后端接收的返回信息
// 至于final 因为在线程中操作 只能定义为final类型的数组
final String[] result = {"暂无信息!"};
new Thread(){
@Override
public void run() {
OkHttpClient okHttpClient = new OkHttpClient();
RequestBody body = null;
try {
// 后端代码下面会有 这里的username需要后端的参数对应
// @RequestMapping("/register")
// public String register(HttpServletRequest request,@RequestParam("username") String username,@RequestParam("password") String password)
body = new FormBody.Builder()
.add("username",jsonObject.getString("username"))
.add("password", jsonObject.getString("password"))
.build();
} catch (JSONException e) {
e.printStackTrace();
}
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//这里特别注意,我翻看了源码,大致猜测是 response.body().string()只可以使用一次,反正我使用两次就会异常
// Log.e("回参",response.body().string());
result[0] = response.body().string();
}
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.e("回参","错");
}
});
}
}.start();
// 这里也是我自己定义的一个方法 就是线程启动时,会耗时去访问后端是否注册成功,因为这个方法也会在主线程执行,因此如果不阻塞的话,该方法会较快的返回默认值,即("暂无信息");
Thread.sleep(1000);
return result[0];
// An highlighted block
//特别说明 这里为什么是使用的@RequestParam
// 因为刚刚我们使用的okhttp并没有使用json格式,而是默认格式,所以需要与参数名一致
@Controller
public class UserController {
@Autowired
UserService userService;
@ResponseBody
@RequestMapping("/register")
public String register(HttpServletRequest request,@RequestParam("username") String username,@RequestParam("password") String password){
System.out.println("收到请求");
if(username!=null && password!=null){
User user = new User();
user.setTel(username);
user.setPassword(password);
if (userService.addUser(user)){
return "注册成功!";
}
return "注册失败!";
}else {
System.out.println("用户名或密码为空");
return "注册失败,未接收到参数!!";
}
}
}
//======================================================================
//如果你想使用okhttp3传送json格式的,你应该这么做
final String[] result = {""};
new Thread(){
public void run(){
MediaType type = MediaType.parse("application/json;charset=utf-8");
RequestBody RequestBody2 = RequestBody.create(type,""+jsonObject.toString());
try {
Log.e("对象:",jsonObject.toString());
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
// 指定访问的服务器地址
.url(url)
.addHeader("username",jsonObject.getString("username"))
.addHeader("password",jsonObject.getString("username"))
.post(RequestBody2)
.build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
Log.e("回参",responseData);
Looper.prepare();
Toast.makeText(context,responseData,Toast.LENGTH_LONG).show();
Looper.loop();
result[0] = responseData;
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
return result[0];
// 你的后端只需要定义一个 User对象 里面只存放usernmae,pssword属性
// 并且在你的参数里这样,它就会自行解析
// 但是注意,这里只传送了一个json数据(因此它可以自行解析到你参数的User user 里),多个json我还在学习 哈哈哈
@ResponseBody
@RequestMapping("/register2")
public String register2(HttpServletRequest request, @RequestBody User user){
System.out.println("收到请求");
if(user !=null){
if (userService.addUser(user)){
return "注册成功!";
}
return "注册失败!";
}else {
System.out.println("用户名或密码为空");
return "注册失败,未接收到参数!!";
}
}
特别说明,是基于springboot2.6 android7