Android使用okhttp异步post请求完成登录功能

在介绍OkHttp的Post请求的基本使用之前,我们需要了解什么是Post,以及什么是Get?对于android程序员来说,对这2个概念不像web工程师那样熟悉,在这里我们先简要说明Post和Get请求的区别:

Post或者Get只是Http协议中向后台服务器发送数据的一种机制,是Http协议的一个组成部分。
Post请求是将要提交到后台服务器的数据放在Http包的包体中。
Get请求是将数据放在URL之后,比如http://androidxx.cn/forum.php?mo ... d=11&extra=page%3D1,可以看到此URL由2部分组成,分别是http://androidxx.cn/forum.php和?后面的参数。这就是典型的Get请求方式。
因为Get请求时直接将参数放在URL后面,而URL的长度是有一定的限制,所以当传递的数据特别大的时候,Get请求就不能完成。
相比较,Post请求的参数是放在Http包的内部,不能轻易被看到;Get请求的参数直接是跟在URL之后,可以很容易被用户获取。所以,相对而言,Post的请求方式更安全。

在实际项目开发过程中,什么时候使用Get、什么时候使用Post呢?
Post(当涉及到参数的安全问题或者参数比较大的时候,应该使用Post请求方式),比如:

登陆
注册
上传
支付
下单
...

Get(Get就是获取的意思,项目开发中,如果是相对简单的查询类接口可以使用Get请求方式),比如:

获取图片
获取文章详情
...

以上就是Get和Post的一个简单的介绍,对刚入门的android程序员应该会有点帮助。然后,接下来我们开始OkHttp的Post异步请求方式的学习。

布局文件就不贴代码了,写两个EditText分别为用户名和密码的输入,id定位username和password,写一个button为提交按钮,id为submit。
 

public class MainActivity extends AppCompatActivity {
    private String jsondata;
    private String usernames,passwords;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final EditText username = findViewById(R.id.username);
        final EditText password = findViewById(R.id.password);
        Button submit = findViewById(R.id.submit);


        submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (TextUtils.isEmpty(username.getText())) {
                    Toast.makeText(MainActivity.this,"请输入用户名",Toast.LENGTH_SHORT).show();
                } else if (TextUtils.isEmpty(password.getText())) {
                    Toast.makeText(MainActivity.this,"请输入密码",Toast.LENGTH_SHORT).show();
                } else {
                    usernames = username.getText().toString();
                    passwords = password.getText().toString();
                    okhttpData();
                }
            }
        });
    }
    //post异步请求
    private void okhttpData(){
        Log.i("TAG","--ok-");
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient client=new OkHttpClient();
                //Form表单格式的参数传递
                FormBody formBody = new FormBody
                        .Builder()
                        .add("username",usernames)//设置参数名称和参数值
                        .add("password",passwords)//设置参数名称和参数值
                        .build();
                Request request = new Request
                        .Builder()
                        .post(formBody)//Post请求的参数传递
                        .url("http://ip:8080/login")
                        .build();
                client.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {}

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        //此方法运行在子线程中,不能在此方法中进行UI操作。
                        jsondata = response.body().string();
                        //解析
                        jsonJXData(jsondata);
                        response.body().close();
                    }
                });
            }
        }).start();
    }

    private void jsonJXData(String jsondata) {
        if(jsondata!=null) {
            try {
                JSONObject jsonObject = new JSONObject(jsondata);
                String data = jsonObject.getString("message");
                if (data.equals("1")){
                    Looper.prepare();
                    Toast.makeText(MainActivity.this,"登录成功",Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(MainActivity.this,HomeActivity.class);
                    startActivity(intent);
                    Looper.loop();
                }else if (data.equals("2")){
                    Looper.prepare();
                    Toast.makeText(MainActivity.this,"用户名或密码不正确",Toast.LENGTH_SHORT).show();
                    Looper.loop();
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }

        }

    }
}

Post同步请求只需要将同步请求中的方法enqueue换成execute方法。此处是针对表单格式数据的传递,如果是json数据格式:



    //设置媒体类型。application/json表示传递的是一个json格式的对象
            MediaType mediaType = MediaType.parse("application/json");
            //使用JSONObject封装参数
            JSONObject jsonObject = new JSONObject();
            try {
                jsonObject.put("参数名","参数值");
            } catch (JSONException e) {
                e.printStackTrace();
            }
            //创建RequestBody对象,将参数按照指定的MediaType封装
            RequestBody requestBody = RequestBody.create(mediaType,jsonObject.toString());
            Request request = new Request
                    .Builder()
                    .post(requestBody)//Post请求的参数传递
                    .url(Config.POST_URL)
                    .build();
            try {
                Response response = okHttpClient.newCall(request).execute();
                String result = response.body().string();
                Log.d("androixx.cn",result);
                response.body().close();
            } catch (IOException e) {
                e.printStackTrace();
            }

以上就是异步/同步post请求实现登录功能的方法

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Android使用OkHttp进行POST请求的步骤如下: 1. 创建OkHttpClient对象 OkHttpClient client = new OkHttpClient(); 2. 创建RequestBody对象 RequestBody requestBody = new FormBody.Builder() .add("username", "admin") .add("password", "123456") .build(); 3. 创建Request对象 Request request = new Request.Builder() .url("http://www.example.com/login") .post(requestBody) .build(); 4. 发送请求并获取响应 Response response = client.newCall(request).execute(); String result = response.body().string(); 其中,第2步中的FormBody.Builder()可以根据实际情况选择其他类型的RequestBody,如Json格式的RequestBody。第3步中的url()方法需要替换成实际的请求地址。第4步中的execute()方法会阻塞当前线程,可以使用enqueue()方法进行异步请求。 ### 回答2: Okhttp是一种用于HTTP请求的第三方库,它非常简便易用,并且具有许多强大的功能。它可以用于GET请求POST请求,还支持文件上传下载操作。 常见的POST请求用于发送表单数据和JSON数据。发送表单数据需要使用FormBody,而发送JSON数据则需要使用RequestBody。下面是一个基本示例: ``` OkHttpClient client = new OkHttpClient(); MediaType mediaType = MediaType.parse("application/json"); RequestBody body = RequestBody.create(mediaType, "{\n\"username\":\"testuser\",\n\"password\":\"testpassword\"\n}"); Request request = new Request.Builder() .url("http://example.com/login") .post(body) .build(); Response response = client.newCall(request).execute(); String responseString = response.body().string(); ``` 在这个示例中,我们首先创建了一个OkHttpClient对象,然后使用MediaType对象将JSON字符串的Content-Type设置为application/json。接着,我们使用RequestBody.create方法创建了RequestBody对象,并传入JSON字符串和MediaType对象。在创建Request对象时,我们设置了URL和请求类型(post),并将RequestBody对象传递给它。最后,我们使用OkHttpClient对象的newCall方法异步地执行请求,并且获取Response对象的响应字符串。 需要注意的是,上述示例是同步执行的。如果要使用异步请求,可以使用enqueue方法,并传递一个Callback对象。enqueue方法将不会阻塞线程,并在请求完成后调用Callback的相应方法。 总之,使用Okhttp发送POST请求非常简便,并且可以用于发送表单数据和JSON数据。它还具有优秀的效率和稳定性,并且可以快速处理多个并发请求。 ### 回答3: 在Android应用程序中,OkHttp是一个流行的HTTP客户端库,可以用于执行HTTP请求和响应。它是由Square开发的,相比于Android原生的HttpURLConnection,OkHttp在多个方面都有不少的优势。 POST请求是HTTP请求类型中的一种,通常用于在服务器上创建新资源或更新现有资源。在使用OkHttp进行POST请求时,需要注意以下几点: 1.创建OkHttpClient对象 首先需要创建一个OkHttpClient实例,该实例负责发送HTTP请求和接收响应。可以使用默认的OkHttpClient.Builder,也可以自定义一些设置: OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .build(); 2.创建请求体(RequestBody) POST请求需要在请求体(RequestBody)中添加提交的数据,可以使用FormBody或MultipartBody等来构建请求体。例如,在表单中添加两个参数(name和age): RequestBody body = new FormBody.Builder() .add("name", "张三") .add("age", "20") .build(); 3.创建请求(Request) 创建请求时,需要指定请求的URL、请求方式(POST)、请求头部和请求体。例如: Request request = new Request.Builder() .url("https://example.com/api/user") .post(body) .addHeader("Authorization", "Bearer " + token) .build(); 4.发送请求并接收响应 通过OkHttpClient发送请求,并且接收服务器响应。例如: try { Response response = client.newCall(request).execute(); if (response.isSuccessful()) { String responseBody = response.body().string(); Log.d(TAG, "response: " + responseBody); } else { Log.d(TAG, "response unsuccessful"); } } catch (IOException e) { Log.e(TAG, "error:" + e.getMessage()); } 以上便是Android使用OkHttp进行POST请求的大致流程,需要注意的是,请求和响应均需要在异步线程中进行,可以使用enqueue方式执行请求使用回调方法接收响应。此外,还需要注意处理异常和错误情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值