Android网络 *** 作与流行框架(一)——网络 *** 作

Android网络 *** 作与流行框架(一)——网络 *** 作,第1张

一、网络基础知识 1、客户端与服务端

客户端请求服务端,服务端响应客户端

2、HTTP协议 定义: HTTP(Hypertext Transfer Protocol)协议, 既超文本传输协议,是建立在TCP/IP协议基础上的网络应用层协议。默认端口是80,使用的版本是HTTP/1.1, 它基于客户/服务器模式(Client/Server), 客户端主动发出HTTP请求, 服务器接收HTTP请求, 返回HTTP响应结果。

请求:

响应

工作原理 1、客户端连接到服务器2、发送HTTP请求3、服务器接收请求并返回HTTP响应4、释放连接5、客户端解析响应内容 3、URL解析

百度一下,你就知道https://www.baidu.com/

什么是URL: URL是统一资源定位符, 在互联网上每一个资源都有一个唯一的URL,我们俗称网址,URL中所包含的信息就是告诉我们文件位置 怎么处理它。URL由4部分组成: 协议、主机、端口、路径一般语法格式: 协议://主机名称[:端口]/路径/[:参数][?查询字符串][#片段] 二、网络请求 1、网络权限申请(9.0前)

2、网络权限申请(9.0后) 创建安全配置文件 在res文件夹下创建xml/network_security_config文件增加cleartextTrafficPermitted属性添加安全配置文件 AndroidManifest.xml中的Application申明

例子:

3、get请求(网络请求不能放在主线程中) HttpURLConnection步骤 实例化一个URL对象获取HttpURLConnection实例设置和请求相关的属性获取响应码判断响应码并获取响应数据

例子:

activity_main.xml




    

MainActivity.java

package com.example.internetproject;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void myclick(View v){
        switch (v.getId()){
            case R.id.get:
                new Thread(){
                    @Override
                    public void run() {
                        super.run();
                        get();
                    }
                }.start();

                break;
        }
    }

    private void get() {

        try {
            //HttpURLConnection
            //1、实例化一个URL对象
            URL url = new URL("http://www.baidu.com");

            //2、获取HttpURLConnection实例
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            //3、设置和请求相关的属性
            // 请求方式
            conn.setRequestMethod("GET");
            // 请求超时时长
            conn.setConnectTimeout(10000);

            //4、获取响应码 默认先发送请求后获取响应码 200成功 404未找到指定资源 500服务器错误
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                //5、判断响应码并获取响应数据
                //获取响应输入流
                InputStream in = conn.getInputStream();
                //在循环中读取输入流
                byte[] b = new byte[1024];
                // in.read(b); //该方法返回值是int类型数据,代表的是实际的数据长度
                int len = 0;
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                while((len = in.read(b)) > -1){
                    //将字节数组里面的内容存/写入缓存流
                    //参数1:待写入的数组
                    //参数2:起点
                    //参数3:长度
                    baos.write(b, 0, len);
                }

                String msg = new String(baos.toString());
                Log.e("TAG", msg+"========");
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

结果:

4、post请求

例子:

activity_main.xml




    

MainActivity.java

package com.example.internetproject;

import androidx.appcompat.app.AppCompatActivity;

import android.icu.util.Output;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;

public class MainActivity extends AppCompatActivity {

    private EditText accEdt, pwdEdt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        accEdt = findViewById(R.id.account);
        pwdEdt = findViewById(R.id.pwd);

    }

    public void myclick(View v){
        switch (v.getId()){
            case R.id.post:
                String account = accEdt.getText().toString();
                String password = pwdEdt.getText().toString();
                new Thread(){
                    @Override
                    public void run() {
                        super.run();
                        post(account, password);;
                    }
                }.start();
                break;
        }
    }

    private void post(String account, String password) {
        try {
            //HttpURLConnection
            //1、实例化一个URL对象
            URL url = new URL("https://www.imooc.com/api/okhttp/postmethod");

            //2、获取HttpURLConnection实例
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            //3、设置和请求相关的属性
            // 请求方式
            conn.setRequestMethod("POST");
            // 请求超时时长
            conn.setConnectTimeout(10000);
            // 设置允许输出
            conn.setDoOutput(true);
            // 设置请求输出类型
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            // 获取输出流(请求正文)
            OutputStream out = conn.getOutputStream();
            out.write(("account="+account+"&pwd="+password).getBytes());

            //4、获取响应码 默认先发送请求后获取响应码 200成功 404未找到指定资源 500服务器错误
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                //5、判断响应码并获取响应数据
                //获取响应输入流
                InputStream in = conn.getInputStream();
                //在循环中读取输入流
                byte[] b = new byte[1024];
                // in.read(b); //该方法返回值是int类型数据,代表的是实际的数据长度
                int len = 0;
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                while((len = in.read(b)) > -1){
                    //将字节数组里面的内容存/写入缓存流
                    //参数1:待写入的数组
                    //参数2:起点
                    //参数3:长度
                    baos.write(b, 0, len);
                }

                String msg = new String(baos.toString());
                Log.e("TAG", msg+"========");
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

结果:

5、get vs post

三、Json数据解析 1、认识Json数据格式

2、利用JSONObject解析 常用方法 getJSONObject(String name) - 获取JSONObject对象常用方法 toString() - 把JSONObject对象转换为json格式的字符串

例子:

public void parseJSONObject(){

        new Thread(){
            @Override
            public void run() {
                super.run();
                String msg = get();
                //解析 JSONObject
                //参数 满足json要求的字符串
                try {
                    JSONObject jo = new JSONObject(msg);
                    //getJSONObject(String name)
                    int status = jo.getInt("status");
                    String msgText = jo.getString("msg");
                    
                    JSONObject data = jo.getJSONObject("data");
                    String title = data.getString("title");
                    Log.e("TAG", "run: " + status + "---" +msgText);
                    
                    // 显示到界面上
                    //此方法在子线程中调用,可以在内部处理界面显示问题
                    //因为它相当于在此刻将 *** 作权由子线程移交给了主线程
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                             textView.setText(title);
                        }
                    });
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }.start();

    }
常用方法 getJSONArray - 获取JSONArray对象

例子:

public void parseJSONObject(){

        new Thread(){
            @Override
            public void run() {
                super.run();
                String msg = get();
                //解析 JSONObject
                //参数 满足json要求的字符串
                try {
                    JSONObject jo = new JSONObject(msg);
                    //getJSONObject(String name)
                    int status = jo.getInt("status");
                    String msgText = jo.getString("msg");
                    
                    //为ListView准备数据源
                    List> list = new ArrayList<>();
                    //=======================
                    //解析Json数组
                    JSONArray ary = jo.getJSONArray("data");
                    //遍历数组
                    for(int i = 0; i < ary.length(); i++){
                        //取出对应索引的object
                        JSONObject obj = ary.getJSONObject(i);
                        String name = obj.getString("name");
                        String id = obj.getString("id");
                        Log.e("TAG", "id=" + id +", name=" + name);

                        Map map = new HashMap<>();
                        map.put("name", name);
                        map.put("id", id);
                        list.add(map);
                    }
                    //===============================

                    //创建SimpleAdapter(数据源 List>, 布局资源 R.layout.item, from, to)
                    String[] from = {"name", "id"};
                    int[] to = {R.id.item_name, R.id.item_id};
                    final SimpleAdapter adapter = new SimpleAdapter(JSONActivity.this, list, R.layout.item, from, to);

                    // 显示到界面上
                    //此方法在子线程中调用,可以在内部处理界面显示问题
                    //因为它相当于在此刻将 *** 作权由子线程移交给了主线程
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            listView.setAdapter(adapter);
                        }
                    });

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

            }
        }.start();

    }
3、GSON解析 常用方法:toJson-将bean对象转换位json字符串常用方法:fromJson-将json字符串转换为bean对象

例子:

Book.java

package com.example.internetproject;

public class Book {
    private String title;
    private String author;
    private String content;

    public Book(String title, String author, String content) {
        this.title = title;
        this.author = author;
        this.content = content;
    }

    public Book() {
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public String toString() {
        return "Book{" +
                "title='" + title + '\'' +
                ", author='" + author + '\'' +
                ", content='" + content + '\'' +
                '}';
    }
}

JSONActivity.java

package com.example.internetproject;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.google.gson.Gson;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JSONActivity extends AppCompatActivity {

    private TextView textView;
    private ListView listView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_json);

        textView = findViewById(R.id.textView);
        listView = findViewById(R.id.list_view);

        findViewById(R.id.parse).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                parseByGSON();
            }
        });

    }

    public void parseByGSON(){
        //1、添加依赖
        //2、实例化一个GSON对象
        Gson gson = new Gson();
        //3、toJson 将对象变为json字符串
        Book b = new Book("西游记", "吴承恩", "西天取经故事");
        String str = gson.toJson(b);
        Log.e("TAG", str);
        
        //4、fromJson 将字符串还原为对象
        Book b2 = gson.fromJson(str, Book.class);
        Log.e("TAG", b2.toString());
    }
}

项目地址: 链接:https://pan.baidu.com/s/1Q5U34STGY1SkDRikpXhz1Q   提取码:95ju 
 

  坐得住板凳,耐得住寂寞,守得住初心!  

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/992920.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存