初试OkHttp3实现登录功能

在OkHttp3之前的版本需要自己定义ResultCallback用于返回数据,而OkHttp3自带了Callback将这个简化不少,这次我就尝试用下OkHttp3来简单实现注册和登录功能

注意
  • 因为是注册和登录的功能,我这里只用post
  • 使用Map封装提交的Post参数
  • 基础用法就不讲了,就直接开始实例吧

封装OkHttp工具类

post与get的差别就在于post需要上传post参数,我这里将参数封装在Map<String,String>中,这里我们不可能一项在request中post(key,value)这样post到requestd中,所以可以先把Map的内容add到FormBody.Builder上,最后在post到request上

public static void post(String address, okhttp3.Callback callback, Map<String,String> map)
    {
        OkHttpClient client = new OkHttpClient();
        FormBody.Builder builder = new  FormBody.Builder();
        if (map!=null)
        {
            for (Map.Entry<String,String> entry:map.entrySet())
            {
                builder.add(entry.getKey(),entry.getValue());
            }
        }
        FormBody body = builder.build();
        Request request = new Request.Builder()
                .url(address)
                .post(body)
                .build();
        client.newCall(request).enqueue(callback);
    }
使用

现在封装好了post方法,只要我们在需要用到的时候调用
登录时直接调用一下代码即可

OkHttpUtil.post(url, new okhttp3.Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                }
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                },map};

慢着,我们 这里的map呢?,
既然是登录,那就把id和密码封装到map中

map.put("phone",id.getText().toString());                map.put("password",password.getText().toString());
回调

由上面的代码可知,调用Post会重写onFailure和onResponse
onFailure是在调用失败时返回的,所以一般
打印错误信息Log.e(TAG, "onFailure: ",e);
onResponse是成功时返回请求值,如JSON等
所以完整的回调是这样的

 @Override
 public void onFailure(Call call, IOException e) {
         Log.e(TAG, "onFailure: ",e);
 }
 @Override
 public void onResponse(Call call, Response response) throws   IOException {
                    String responseBody = response.body().string();
                    try {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if(token!=null)
                                {
                                    CommonVari.token = token;
                                    Intent intent1 = new                                        Intent(LoginActivity.this,MainActivity.class);
                                    startActivity(intent1);
                                    CommonVari.FAG = 1;
                                    finish();
                                }else{
                                    new ToastUtil(LoginActivity.this,0);
                                }
                            }
                        });
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            },map);
        }

其中ToastUtil是自定义的Toast,在登录信息错误时使用这里可以忽略,当信息没错时就可以跳转到主界面

完整代码

OkHttpUtil.java


public class OkHttpUtil {
    public static void post(String address, okhttp3.Callback callback, Map<String,String> map)
    {
        OkHttpClient client = new OkHttpClient();
        FormBody.Builder builder = new FormBody.Builder();
        if (map!=null)
        {
            for (Map.Entry<String,String> entry:map.entrySet())
            {
                builder.add(entry.getKey(),entry.getValue());
            }
        }
        FormBody body = builder.build();
        Request request = new Request.Builder()
                .url(address)
                .post(body)
                .build();
        client.newCall(request).enqueue(callback);
    }
}

LoginActivity.java

public class LoginActivity extends AppCompatActivity implements View.OnClickListener{

    String TAG = "LoginActivity";
    private Button visitorBt;
    private EditText id;
    private EditText password;
    private Button registerBt;
    private Button loginBt;
    private Button modifyBt;
    //private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        id = (EditText) findViewById(R.id.login_id);
        password = (EditText) findViewById(R.id.login_password);
        loginBt = (Button) findViewById(R.id.login_bt);
        registerBt = (Button) findViewById(R.id.register);
        modifyBt = (Button) findViewById(R.id.login_modify_bt);
        visitorBt = (Button) findViewById(R.id.visitor);
        initView();

    }

    private void initView()
    {
        //注册登录按钮
        loginBt.setOnClickListener(this);
        //注册按钮监听
        registerBt.setOnClickListener(this);
        //注册修改密码按钮
        modifyBt.setOnClickListener(this);
        //游客登录按钮
        visitorBt.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.register:
                Intent intent = new Intent(LoginActivity.this,RegisterActivity.class);
                startActivity(intent);
                 break;
            case R.id.login_bt:
                login();
                break;
            case R.id.login_modify_bt:
                Intent intent2 = new Intent(LoginActivity.this,ModifyPasswordActivity.class);
                startActivity(intent2);
                break;
            case R.id.visitor:
                Intent intent3 = new Intent(LoginActivity.this,MainActivity.class);
                startActivity(intent3);
                finish();
                break;
        }
    }

    /**
     * 处理登录事件
     */
    private void login() {
        String url = Api.url+"auth/login";
        Map<String,String> map = new HashMap<>();
        if(id.getText().toString().length()!=11)
        {
            new ToastUtil(LoginActivity.this, CommonVari.IDNULL);
        }else if(password.getText().toString().length()<6){
            new ToastUtil(LoginActivity.this,CommonVari.LIT);
        }
        else{
            map.put("phone",id.getText().toString());
            map.put("password",password.getText().toString());

            OkHttpUtil.post(url, new okhttp3.Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.e(TAG, "onFailure: ",e);
                }
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    String responseBody = response.body().string();
                    try {
                        final String token = JsonUtil.getToken(responseBody);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if(token!=null)
                                {
                                    CommonVari.token = token;
                                    Intent intent1 = new Intent(LoginActivity.this,MainActivity.class);
                                    startActivity(intent1);
                                    CommonVari.FAG = 1;
                                    finish();
                                }else{
                                    new ToastUtil(LoginActivity.this,0);
                                }
                            }
                        });

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            },map);
        }
    }
}
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,下面是安卓使用 okhttp 实现登录注册功能的完整代码示例: 1. 在你的项目中添加 okhttp 依赖。 ``` implementation 'com.squareup.okhttp3:okhttp:4.9.0' ``` 2. 创建一个 OkHttpClient 实例用于发送请求。 ``` OkHttpClient client = new OkHttpClient(); ``` 3. 创建一个 RequestBody 对象用于发送请求时的参数。 ``` RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("username", "your_username") .addFormDataPart("password", "your_password") .build(); ``` 4. 创建一个 Request 对象,包含请求的 URL、请求方式和请求参数。 ``` Request request = new Request.Builder() .url("http://your_domain/login.php") .post(requestBody) .build(); ``` 5. 使用 OkHttpClient 发送请求,并处理响应。 ``` try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException("Unexpected code " + response); } // 处理响应 String responseData = response.body().string(); Log.d(TAG, "response data: " + responseData); } ``` 6. 注册功能与登录类似,只需要修改请求的 URL 和参数即可。 ``` RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("username", "your_username") .addFormDataPart("password", "your_password") .addFormDataPart("email", "your_email") .build(); Request request = new Request.Builder() .url("http://your_domain/register.php") .post(requestBody) .build(); ``` 注意,这里只是一个简单的示例,并未考虑到网络请求的异步处理、异常处理等问题,具体实现还需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值