前置准备
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高版本联网失败解决办法