目录

前言

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. Git初入

    Git记录 使用git 也有一段时间了, git的入门级了解也就不再多说, 但平常使用中, 仍然会遇到很多问题, 在此记录一二. 在查资料的过程中, 发现了两个比较好的资料: 特别是第二个, 相当详细 ...

  2. Activity的setContentView的流程

    最简单的Activity中的内容大致是这样的: public class MainActivity extends Activity { @Override public void onCreate( ...

  3. linux makefile字符串操作函数 替换subst、模式替换patsubst、去首尾空格strip、查找字符串findstring、过滤filter、反过滤filter-out、排序函数sort、取单词word、取单词串wordlist、个数统计words

    1.1       字符操作函数使用 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函 ...

  4. iOS-OC、Swift 混编之桥接文件

    新建一个OC语言的项目,然后添加一个基于NSObject的Swift文件SwiftFileModel类 .swift import UIKit class SwiftFileModel: NSObje ...

  5. ABP官方文档翻译 3.2 值对象

    值对象 介绍 值对象基类 最佳实践 介绍 "展现领域描述性层面且没有概念性身份的对象称之为值对象."(Eric Evans). 和实体相反,实体有身份标示(Id),值对象没有身份标 ...

  6. gitlab 操作指南

    重置密码 https://docs.gitlab.com/ce/security/reset_root_password.html gitlab 一键安装 https://docs.gitlab.co ...

  7. 51NOD 1238 最小公倍数之和 V3 [杜教筛]

    1238 最小公倍数之和 V3 三种做法!!! 见学习笔记,这里只贴代码 #include <iostream> #include <cstdio> #include < ...

  8. 计算机基础之Windows10操作系统安装U盘制作

    1.第一步,下载Windows10--ISO镜像(Windows7类似),下载站点: https://msdn.itellyou.cn/(百度搜索msdn即可),个人认为这是最干净的操作系统镜像站点, ...

  9. 【Tools】linux更改分辨率,解决虚拟机安装后太小的问题

    Linux更改屏幕分辨率 1,分辨率模式已存在 1)如何查询是否存在: 终端输入命令:xrandr,即会输出当前已存在的分辨率模式. 2)如何配置: 使用命令xrandr --output 显示器名称 ...

  10. MarkDown思考

    前言 使用MarkDown有一段时间了,感觉的确很方便.大大提高了工作效率,并带来了良好的工作体验.但是,一直以来我都有一个困惑,就是MarkDown的插件和编辑器纷繁无比,却通常各自有一套自己的实现 ...