okhttp3 springboot post 接收与传参

这里写自定义目录标题

  • 利用Springboot做后端,安卓做前端的接收参数问题,直接上代码

利用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

你可能感兴趣的:(笔记,java,windows,spring,boot,android,studio)