android调用RESTfulAPI实现登录功能(新大陆)

目标:登录并获取云平台的AccessToken

前置准备

API采用的是http协议,并且以POST的方式发送的请求,请求包括Account和Password

响应参数如下图,返回的是JSON数据
在这里插入图片描述
返回示例如下图
在这里插入图片描述
我们需要将返回的JSON数据解析,我准备将JSON数据转化为相应的实体bean
为此需要准备几样偷懒工具:GSON库和GsonFormat插件,自行百度
使用方法:

//1.创建一个新的类bean
//2.依次点击Code->Generate->GsonFormat
//3.复制返回示例,点击OK
//4.已经自动生成了bean实体类
...
//String json 为我们收到的返回信息
bean b = null;
Gson gson = new Gson();
b = gson.fromJson(json,bean.class);

部分代码

private void init() {
        et_username = findViewById(R.id.aName);
        et_psd = findViewById(R.id.aPassword);
        bt_login = findViewById(R.id.abutton);
        bt_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //获取输入的用户名和密码
                Account = et_username.getText().toString();
                Password = et_psd.getText().toString();
                if (Account.equals("") || Password.equals("")) {
                    Toast.makeText(getApplicationContext(), "用户名或密码为空", Toast.LENGTH_SHORT).show();
                }
                Thread thread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        init_api(Account, Password);
                        if (b.getStatus()==0) {
                            //跳转到主页面的代码
                            //
                            //
                        } else {
                            //当Toast在子线程中使用时,必须加上Looper.prepare()和Looper.loop()
                            Looper.prepare();
                            Toast.makeText(getApplicationContext(), b.getMsg(), Toast.LENGTH_SHORT).show();
                            Looper.loop();
                        }
                    }

                });
                thread.start();
            }
        });
    }

    private void init_api(String account, String pwd) {
        String urlpath = "http://api.nlecloud.com/Users/Login";
        URL url;
        try {
            url = new URL(urlpath);
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("Account", account);
            jsonObject.put("Password", pwd);
            //将参数put到json
            String content = String.valueOf(jsonObject);
            //开启连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setDoOutput(true);//允许写出
            conn.setDoInput(true);//允许读入
            conn.setRequestMethod("POST");//提交方式
            conn.setRequestProperty("Content-Type", "application/json");//设置参数类型是json格式
            //写输出流,将要转的参数写入流
            OutputStream os = conn.getOutputStream();
            os.write(content.getBytes());
            os.close();
            int code = conn.getResponseCode();
            if (code == 200) {
                //读取返回的json
                InputStream inputStream = conn.getInputStream();
                //调用NetUtils() 将流转成String类型
                String json = NetUtils.readString(inputStream);
                Gson gson = new Gson();
                b = gson.fromJson(json,bean.class);
            } else {
                Toast.makeText(getApplicationContext(), "数据提交失败", Toast.LENGTH_SHORT).show();
            }
        }catch (MalformedURLException e){
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static class NetUtils {
        public static byte[] readBytes(InputStream is){
            try {
                byte[] buffer = new byte[1024];
                int len = -1 ;
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                while((len = is.read(buffer)) != -1){
                    baos.write(buffer, 0, len);
                }
                baos.close();
                return baos.toByteArray();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null ;
        }
        public static String readString(InputStream is){

            return new String(readBytes(is));
        }

    }

注意

1.申请网络权限
AndroidManifest.xml文件中添加如下语句(放在application外)

<uses-permission android:name="android.permission.INTERNET" />

2.还是联网的问题,现在版本都很高,这个问题基本都有
链接:Android高版本联网失败解决办法

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值