目录

前言

1 Get方式和Post方式接口说明

2 OkHttp库简单介绍及环境配置

3 具体实现


前言

本文具体实现思路和大部分代码参考自《第一行代码》第2版,作者:郭霖;但是文中讲解部分和POST请求方式实现代码还是楼主自己码出来的,本文相当于是对《第一行代码》网络通信部分内容的一次小小的拓展吧。

还有就是,我会把本文实现的Demo源码在文末分享,有兴趣的小伙伴可以直接拿来用,代码也比较简洁,对于初学者帮助应该还是蛮大的。

最后,说一下我学习《第一行代码》书本上网络通信部分遇到的小问题:

在实现书本上解析JSON格式数据,并在控制台上使用log方式打印解析出的数据信息时,控制台只提示了以下一句信息(PS:对,只有一句提示):

I/System: core_booster, getBoosterConfig = false

然后,就是没有任何打印信息(PS:按照正常情况,是会打印出解析出的JSON数据),我在此查找了两个多小时原因,结果网上对于此说明的文章,也无法解决我的问题。

到此时,开始尝试注释,分断分方法区间调用parseJSONWithJSONObject()方法来解析JSON格式数据,最后我在parseJSONWithJSONObject()方法的For循环中加了一个Toast提示用于判断获取数据信息情况下,并把parseJSONWithJSONObject()放在了showResponse()方法的子线程中调用,才发现成功解析出了数据,但是log打印依然没有在控制台输出。Log打印信息我就没再去追究了,毕竟已经在手机端实现出了JSON数据解析,所以我想了想,应该是自己log方法使用和AndroidStudio配置导致无法正常打印信息。

PS:书本上关于此处部分代码链接


1 Get方式和Post方式接口说明

注:下面两个接口是我自己使用Flask+MongoDB写的简单接口,搭建在阿里云服务器上,仅作学习使用~

(1)Get请求方式接口

功能描述

用户登陆

调用方式

Key

Value

请求URL

http://120.79.82.151/login

HTTP请求方式

GET

支持格式

JSON

是否需要登录

入参说明

返回值说明

参数名

类型及范围

描述

name

String

返回信息

passward

String

返回信息

返回值示例

[
{ "name": "舞动的心", "passward": "123456" }, { "name": "12350@qq.com", "passward": "123456" }, { "name": "12350@qq.com", "passward": "123456" }, { "name": "12350@qq.com", "passward": "123456" }, { "name": "dsff50@qq.com", "passward": "dsaf"
}
]

(2)Post请求方式接口

功能描述

用户注册

调用方式

Key

Value

请求URL

http://120.79.82.151/register

HTTP请求方式

POST

支持格式

JSON

是否需要登录

入参说明

参数名

必选

类型及范围

描述

name

String

用户名

password

String

登录密码

nickname

String

用户昵称

返回值说明

参数名

类型及范围

描述

name

String

返回信息

passward

String

返回信息

nickname

String

返回信息

返回值示例

{

    "name": "dsff50@qq.com",

    "nickname": "舞动的心05",

    "passward": "dsaf"

}

2 OkHttp库简单介绍及环境配置

OkHttp是有Square公司开发的。OkHttp在接口封装上做得简单易用,比起原生的HttpURLConnection要好用好多,而且实现的代码简洁易懂。现在已是大多数Android开发者首选的网络通信库,它的项目主页地址:https://github.com/square/okhttp

OkHttp是第三方库,所以在使用之前,我们需要在项目app/build.grade文件中进行配置,找到dependencies,添加以下加粗红色内容(PS:其中版本信息可以查看okhttp项目主页最新版进行配置,也可以不用变更):

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:design:25.2.0'
compile 'com.android.support:recyclerview-v7:25.2.0' compile 'com.squareup.okhttp3:okhttp:3.4.1'
testCompile 'junit:junit:4.12'
}

3 具体实现

GET方式模拟实现用户登陆功能,获取数据后解析并验证,如果验证成功,会有Toast提示“登陆成功!!!”。

POST方式模拟实现用户注册功能,提交数据获取验证数据后解析并验证,如果验证成功,会有Toast提示“注册成功!!!”。

具体运行结果:

具体实现代码:

代码分为两部分,一部分是layout布局文件,只有一个activity_main.xml文件;一部分是Java类,只有两个文件,分别是MainActivity类和HttpUtil类。整体的代码量很少。具体如下:

activity_main.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" > <Button
android:id="@+id/send_request"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send Request(Get方式)" /> <Button
android:id="@+id/send_response"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send Response(Post方式)"
android:onClick="post_click"/> <ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent" > <TextView
android:id="@+id/response_text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView> </LinearLayout>

MainActivity类代码:

package com.liu.mapliutest;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast; import org.json.JSONArray;
import org.json.JSONObject; import java.io.IOException; import okhttp3.Call;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import okhttp3.Response; public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView responseText;
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button sendRequest = (Button) findViewById(R.id.send_request);
responseText = (TextView) findViewById(R.id.response_text);
sendRequest.setOnClickListener(this);
} @Override
public void onClick(View v) {
if (v.getId() == R.id.send_request) {
HttpUtil.sendOkHttpRequest("http://120.79.82.151/login", new okhttp3.Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
// 在这里根据返回内容执行具体的逻辑
showResponse(response.body().string(), 0);
} @Override
public void onFailure(Call call, IOException e) {
// 在这里对异常情况进行处理
}
});
}
} //将提交到服务器数据转换为JSON格式数据字符串
public String getJson(String name, String passward, String nickname)throws Exception {
JSONObject jsonParam = new JSONObject();
jsonParam.put("name", name);
jsonParam.put("passward", passward);
jsonParam.put("nickname",nickname);
return jsonParam.toString();
} //此处是POST方式Button的触发事件,刚开始写触发事件时,写在了onClick()方法中,使用else if条件判断,结果没有响应,所以改写成了单独方法。
public void post_click(View v) {
String json = ""; try
{
json = getJson("liuzhen01","456321","wudongdexin");
}
catch (Exception e)
{
e.printStackTrace();
} RequestBody requestBody = RequestBody.create(JSON, json);
HttpUtil.sendOkHttpResponse("http://120.79.82.151/register",requestBody, new okhttp3.Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
// 在这里根据返回内容执行具体的逻辑
showResponse(response.body().string(), 1);
} @Override
public void onFailure(Call call, IOException e) {
// 在这里对异常情况进行处理
}
});
} //解析GET方式请求返回JSON数据
private void parseJSONWithJSONObject(String jsonData) {
try {
JSONArray jsonArray = new JSONArray(jsonData);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String name = jsonObject.getString("name");
String passward = jsonObject.getString("passward");
if(name.equals("舞动的心") && passward.equals("123456"))
Toast.makeText(MainActivity.this, "登陆成功!!!", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
} //解析方式请求返回JSON数据
private void parseJSONWithJSONObjectPost(String jsonData) {
try {
JSONArray jsonArray = new JSONArray(jsonData); //注意,此处是一个JSON格式数组
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String name = jsonObject.getString("name");
String passward = jsonObject.getString("passward");
if(name.equals("liuzhen01") && passward.equals("456321"))
Toast.makeText(MainActivity.this, "注册成功!!!", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
} private void showResponse(final String response, final int judge) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// 在这里进行UI操作,将结果显示到界面上
if(judge == 0)
parseJSONWithJSONObject(response); //放在此处执行,处理服务器上Get方式获取的数据,进行相关功能逻辑处理
else {
parseJSONWithJSONObjectPost("["+response+"]"); //处理Post方式获取数据,此处加上中括号,因为Post返回的是一个JSON数据,加上中括号变成数组格式
}
responseText.setText(response);
}
});
} }

HttpUtil类代码:

package com.liu.mapliutest;

import org.json.JSONObject;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody; /**
* Created by 舞动的心 on 2018/3/4.
*/ public class HttpUtil { //使用Get方式获取服务器上数据
public static void sendOkHttpRequest(final String address, final okhttp3.Callback callback) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(address)
.build();
client.newCall(request).enqueue(callback);
} //使用Post方式向服务器上提交数据并获取返回提示数据
public static void sendOkHttpResponse(final String address, final RequestBody requestBody, final okhttp3.Callback callback) {
OkHttpClient client = new OkHttpClient();
// JSONObject object;
Request request = new Request.Builder()
.url(address).post(requestBody).build();
client.newCall(request).enqueue(callback);
} }

项目代码链接:https://coding.net/u/LiuZhen1995/p/MyDemo/git/tree/Thirteen

使用基于Android网络通信的OkHttp库实现Get和Post方式简单操作服务器JSON格式数据的更多相关文章

  1. Android读取JSON格式数据

    Android读取JSON格式数据 1. 何为JSON? JSON,全称为JavaScript Object Notation,意为JavaScript对象表示法. JSON 是轻量级的文本数据交换格 ...

  2. 实现android上解析Json格式数据功能

    实现android上解析Json格式数据功能,该源码转载于安卓教程网的,http://android.662p.com ,个人感觉还不错的,大家可以看看一下吧. package com.practic ...

  3. app开发历程————Android程序解析服务器端的JSON格式数据,显示在界面上

    上一篇文章写的是服务器端利用Servlet 返回JSON字符串,本文主要是利用android客户端访问服务器端链接,解析JSON格式数据,放到相应的位置上. 首先,android程序的布局文件main ...

  4. Android之JSON格式数据解析

    查看原文:http://blog.csdn.net/hantangsongming/article/details/42234293 JSON:JavaScript 对象表示法(JavaScript ...

  5. Android创建JSON格式数据

    Android创建JSON格式数据 作为上一篇博客的补充,简单那解说了一下Android创建JSON格式数据的小Demo. 1. 创建JSON格式数据 对于Android创建JSON格式数据.因为An ...

  6. Android 如何通过Retrofit提交Json格式数据

    本文将介绍如何通过retrofit库post一串json格式的数据.首先post的json数据格式如下: { "Id": "string", "Dev ...

  7. Android 解析JSON格式数据

    比起XML,JSON主要优势在于它的体积更小,在网络上传输的时候可以更省流量.但缺点在于,它的语义性较差,显示不如XML直观. JSON格式 :  { "name_A" : &qu ...

  8. Android中解析JSON格式数据常见方法合集

    待解析的JSON格式的文件如下: [{"id":"5", "version":"1.0", "name&quo ...

  9. Android使用OKHttp库实现视频文件的上传到服务器

    目录 1 服务器接口简介 2 Android端代码实现 2.1 xml布局文件 2.2 Activity类 2.3 Okhttp网络通信类 1 服务器接口简介 此处我使用的服务器接口是使用Flask编 ...

随机推荐

  1. Linux指令--more,less

    文章出处:http://www.cnblogs.com/peida/archive/2012/11/05/2754477.html,感谢原作者无私的分享. more命令,功能类似 cat ,cat命令 ...

  2. SQL模板资源管理器,你用了吗?

    SQL Server Management Studio 有个模板资源管理器,不知你用过没有?使用模板创建脚本.自定义模板等功能能大大提高你的工作效率,如果没有尝试过,赶紧去试试吧.很多时候,我们习惯 ...

  3. java中的 private Logger log=Logger.getLogger(this.getClass());

    this.getClass()得到什么? this 表示当前对象的引用: getClass() 是 java.lang.Object 中的方法,它返回一个对象的运行时类: this.getClass( ...

  4. jsp中 scope="application" 表示

    jsp中 <jsp:useBean id="countbean" scope="application" class="count.counte ...

  5. ansible 批量安装zabbix agentd客户端

    目录结构 # tree /etc/ansible/ /etc/ansible/ ├── ansible.cfg ├── hosts ├── roles │   └── zabbix-agentd │  ...

  6. html5学习之旅第一篇

    什么是 HTML5? HTML5 是下一代 HTML 标准. HTML , HTML 4.01的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HTML5 仍处于完善之中.然 ...

  7. Linq to SQL 中实现模糊查询

    list = list.Where(i => i.Name.Contains(empName)).ToList();

  8. 21_python集合总结

    集合 1.无序的:没有索引,不能改和删出某个元素,不能返回某个索引元素2.不可重复 : 可以利用set去重3.数学运算:交集.并集.差集,反交集,超集/子集4.里面的元素:必须是可哈希的,不可变的.他 ...

  9. mysql安装(CentOS 7.1 (64-bit system) MySQL 5.6.24)

    环境:CentOS 7.1 (64-bit system) MySQL 5.6.24yum install libaio //安装依赖的包wget http://dev.mysql.com/get/m ...

  10. 新人如何运行Faster RCNN的tensorflow代码

    0.目的 刚刚学习faster rcnn目标检测算法,在尝试跑通github上面Xinlei Chen的tensorflow版本的faster rcnn代码时候遇到很多问题(我真是太菜),代码地址如下 ...