【Android开发基础】网络交互-okHttp的使用

文章目录

    • 一、引言
    • 二、操作
      • 1、权限
      • 2、依赖
      • 3、使用

一、引言

okHttp是一套处理HTTP网络请求的依赖库,在Android开发中,我估计大部分软件都在使用他进行网络请求连接和数据交互。

  • 描述:app需要和服务器进行数据交互
  • 难度:初级

二、操作

1、权限

使用okHttp进行网络交互,肯定绕不开网络权限

【Android开发基础】网络交互-okHttp的使用_第1张图片

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

2、依赖

关于客户端和服务端的数据交互,用的比较熟练的就是okHttp和Gson的组合。

【Android开发基础】网络交互-okHttp的使用_第2张图片

	//okHttp
    implementation 'com.squareup.okhttp3:okhttp:3.4.1'
    //gson   Json -> Object
    implementation 'com.google.code.gson:gson:2.8.2'

3、使用

  • okHttp
	private static String IP = "10.0.2.2";
    private static String port = "8080";
    private static String p = "http://" + IP + ":" + port + "/";   //服务器接收地址

    /**
     * 使用静态内部类的方式实现单例模式
     */
    private static class UploadUtilInstance{
        private static final okHttp INSTANCE = new okHttp();
    }
    
	/**
     * post方法
     * @param key   controller层的@PostMapper("")
     * @param body  传递的数据
     * @return  返回数据 @type String
     * @throws IOException
     */
    public static String post(String key, RequestBody body) throws IOException {
        //拼接完整的url
        String path = p + key;
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(path)
                .post(body)
                // token验证,也可以使用BirdgeInterceptor拦截器进行设置
                // .header("token", user.getString("token", ""))  
                .build();
        Response response = client.newCall(request).execute();
        if (!response.isSuccessful())
            throw new IOException("Unexpected code " + response);  // 一般都是返回401、404一些异常,可以自己定义方法进行处理
        String resp = response.body().string();
        return resp;
    }

	/**
     * get方法
     * @param key   controller层的@PostMapper("")
     * @return  返回数据 @type String
     * @throws IOException
     */
    public static String get(String key) throws IOException {
        //拼接完整的url
        String path = p + key;
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(path)
                .get()
                // token验证,也可以使用BirdgeInterceptor拦截器进行设置
                // .header("token", user.getString("token", ""))
                .build();
        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) {
            throw new IOException("Unexpected code " + response);
        return response.body().string();
    }

	/**
     * 接收Image资源
     * @param type 设置的静态资源映射地址  registry.addResourceHandler("/image/**").addResourceLocations("file:D://image");
     * @param path 图片名
     * @return  返回数据 @type String
     * @throws IOException
     */
    public static BitmapDrawable getBitmap(String type, String path) throws IOException{
        URL url = new URL(p + type + path);
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        if(conn.getResponseCode() == 200){
            InputStream inputStream = conn.getInputStream();
            ByteArrayOutputStream outStream =new ByteArrayOutputStream();
            byte[] buffer = new byte[9999];
            int len = 0;
            while ((len = inputStream.read(buffer)) != -1)//读取流中的数据
            {
                outStream.write(buffer,0,len);
            }
            inputStream.close();
            //得到的字节Byte
            byte[] b =  outStream.toByteArray();
            Bitmap map = BitmapFactory.decodeByteArray(b,0,b.length);
            BitmapDrawable bd = new BitmapDrawable(map);
            return bd;
        }
        return null;
    }
  • gosn
new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            String getJson = okHttp.get("info");
            if (getJson == null) {
                Gson gson = new Gson();
                // 将服务器传了的关于User实体的json格式数据转换为实体数据
                // 一般传过来都是Result数据,这里为了方便理解,就用User来说明
                User user = gson.fromJson(getJson, new TypeToken<User>(){}.getType());
            } else {
                // 反馈结果
                Looper.prepare();
                // result.getMsg()
                Toast.makeText(this, "结果为空!", Toast.LENGTH_SHORT).show();
                Looper.loop();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();

你可能感兴趣的:(Android开发,okhttp,android)