===============原生http=====================

public class MainActivity extends AppCompatActivity implements View.OnClickListener {private EditText et;private String thtmlStr;private TextView tv;private ImageView imav;
protected final int REQUESTSUCCESS=0;//常量
protected  final int REQUESTFAILure=1;// 在主线程定义一个Handler,用来法消息和处理消息,Looper的作用是监听消息队列,去消息队列取消息;程序一启动就会创建一个主线程,同时就有了一个Looper循环
//   @SuppressLint("HandlerLeak")
//   private Handler  handler = new Handler(){
//        //实现handler的方法,这个方法在主线程执行
//        public void handleMessage (Message msg){
//
//            Log.e("main","main");
//if(msg.what==0) {tv.setText((String) msg.obj);//只有主线程才能更新UI,网络请求必须在在子线程
//    imav.setImageBitmap((Bitmap)msg.obj);
//}else if(msg.what==1){
//    Toast.makeText(getApplicationContext(),"服务器正忙",Toast.LENGTH_LONG).show();
//}else{
//    imav.setImageBitmap((Bitmap)msg.obj);
//}
//
//        }
//    };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button surebtn = (Button) findViewById(R.id.sureBtn);surebtn.setOnClickListener(this);//按钮的点击事件Log.e("s","11");et = findViewById(R.id.urlText);
tv=findViewById(R.id.showtext);
imav=findViewById(R.id.look);}//网路请求要加权限@Overridepublic void onClick(View view) {Log.e("v","fff");new Thread(new Runnable(){public void run () {try {//获取缓存的图片String path = et.getText().toString().trim();File file = new File(getCacheDir(), Base64.encodeToString(path.getBytes(),Base64.DEFAULT));if (file.exists() && file.length() > 0) {
Log.e("f","使用缓存");Bitmap cacheMap = BitmapFactory.decodeFile(file.getAbsolutePath());
//                    Message msg = Message.obtain();
//                    msg.obj = cacheMap;
//                    handler.sendMessage(msg);} else {HttpURLConnection conn = (HttpURLConnection) url.openConnection();//http连接//post方式***********************conn.setRequestMethod("POST");conn.setReadTimeout(5000);conn.setRequestProperty("ext/plain, text/html","application/x-www-form-urlencoded");conn.setRequestProperty("Content-Length",path.length()+"");conn.setDoOutput(true);//标记,允许输出conn.getOutputStream().write(path.getBytes());//以流的形式吧数据写给服务器//get方式****************************URL url = new URL(path);//创建urlconn.setRequestMethod("GET");//必须大写,默认是GETconn.setConnectTimeout(15000);//设置超时时间int code = conn.getResponseCode();//获取状态码if (code == 200) {//请求成功InputStream in = conn.getInputStream();//获取服务器返回的数据。流的处理抽取成一个工具类Utils
//                    thtmlStr = StreamTools.reamStream(in);//                    Message msg = new Message();
//                    msg.what=REQUESTSUCCESS;
//                    msg.obj = thtmlStr;
//                    Log.e("msg", (String) msg.obj);
//                    handler.sendMessage(msg);//发送消息,在主线程handler中接收//****************缓存图片************FileOutputStream fos = new FileOutputStream(file);int len = -1;byte[] buffer = new byte[1024];while ((len = in.read(buffer)) != -1) {fos.write(buffer, 0, len);}fos.close();in.close();//**************handler发消息更新UI**************************
//                        Message msg = Message.obtain();
//                        msg.what = REQUESTSUCCESS;
//                        Bitmap bm = BitmapFactory.decodeStream(in);//吧流转换成位图;,如果in没有关闭流使用这个方法final   Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
//                        msg.obj = bm;
//                        handler.sendMessage(msg);//***************runOnUiThread更新UI****************如果只是更新ui,则使用runOnUiThread,如果要携带数据,就用handler;runOnUiThread(new Runnable() {@Overridepublic void run() {//不管在主线程还是子线程都会执行imav.setImageBitmap(bm);}});} else {//                        Message msg = new Message();
//                        msg.what = REQUESTFAILure;
//                        handler.sendMessage(msg);//发送消息,在主线程handler中接收}}} catch(MalformedURLException e){e.printStackTrace();} catch(IOException e){e.printStackTrace();}}}) .start();}}

----------读取stream流的工具类---------

/**
 * Created by wofu on 2018/3/27.
 * stream的工具类
 */

public class StreamTools extends Object {//吧inputstream转换成String
    public static String reamStream (InputStream in) throws IOException {
//定义一个内存输出流
        ByteArrayOutputStream out=new ByteArrayOutputStream();int len=-1;byte[] buffer= new byte[1024];if((len=in.read(buffer))!=-1){out.write(buffer,0,len);//
}
String content=new String(out.toByteArray());return content;}}

============Volley=============

=============Retrofit==========

========OkHttp===========

OKHttp  Github地址:----https://github.com/square/okhttp

导入okhttp中遇到的问题:1,可能重复导入---解决:在file-》project Structure-->app-->dependencies;吧okhttp删掉;

okhttp使用:https://blog.csdn.net/fightingXia/article/details/70947701

https://blog.csdn.net/s13383754499/article/details/78978025

https://www.jianshu.com/p/f5320b1e0287

问题:response.body().string()只能调用一次分析

使用:

在清单文件中添加权限:

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

在app模块中的build. graidle 中

dependencies {
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
}
*********OKHttp中设置请求头特别简单,在创建request对象时调用一个方法即可。
Request request = new Request.Builder().url("http://www.baidu.com").header("User-Agent", "OkHttp Headers.java").addHeader("token", "myToken").build();

1.同步:get

//get同步请求---http://ddb.cn/api/VlianbaoCash/depositpublic void gettongbuDatasync(){new Thread(new Runnable() {@Overridepublic void run() {OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象Request request = new Request.Builder().url(String.valueOf(test.getText()))//请求接口。如果需要传参拼接到接口后面。.build();//创建Request 对象Response response = null;try {response = client.newCall(request).execute();//得到Response 对象Log.e("kwwl","get同步res=="+response.body().string());} catch (IOException e) {e.printStackTrace();}}}).start();}//get异步请求
private void getyibuDataAsync() {new Thread(new Runnable() {@Overridepublic void run() {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(String.valueOf(test.getText())).build();//创建request对象client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {//请求失败的回调}@Overridepublic void onResponse(Call call, Response response) throws IOException {
//请求成功的回调if (response.isSuccessful()) {//回调的方法执行在子线程。Log.d("kwwl", "get异步获取数据成功了");Log.d("kwwl", "get异步response.code()==" + response.code());Log.d("kwwl", "get异步response.body().string()==" + response.body().string());}}});}}).start();
}//post同步  //post异步private void postyibuDataWithParame() {new Thread(new Runnable() {@Overridepublic void run() {OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体formBody.add("username","zhangsan");//传递键值对参数Request request = new Request.Builder()//创建Request 对象。.url(String.valueOf(test.getText())).post(formBody.build())//传递请求体.build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {
//请求成功的回调if(response.isSuccessful()){//回调的方法执行在子线程。Log.d("kwwl","post异步获取数据成功了");Log.d("kwwl","post异步response.code()=="+response.code());Log.d("kwwl","post异步response.body().string()=="+response.body().string());}}});}}).start();}
//    使用FormBody传递键值对参数,用来上传String类型的键值对 ,post方法接收的参数是RequestBody 对象,所以只要是RequestBody 类以及子类对象都可以当作参数进行传递。FormBody就是RequestBody 的一个子类对象。
private void postyibuFormBodyDataWithParame() {new Thread(new Runnable() {@Overridepublic void run() {OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体formBody.add("username","zhangsan");//传递键值对参数Request request = new Request.Builder()//创建Request 对象。.url("http://www.baidu.com").post(formBody.build())//传递请求体.build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {
//请求成功的回调if(response.isSuccessful()){//回调的方法执行在子线程。Log.d("kwwl","post异步获取数据成功了");Log.d("kwwl","post异步response.code()=="+response.code());Log.d("kwwl","post异步response.body().string()=="+response.body().string());}}});}}).start();
}//    使用RequestBody传递Json,RequestBody是抽象类,故不能直接使用,但是他有静态方法create,使用这个方法可以得到RequestBody对象。这种方式可以上传Json对象或File对象。private void postyibuFileDataWithParame() {new Thread(new Runnable() {@Overridepublic void run() {OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。MediaType JSON = MediaType.parse("application/json; charset=utf-8");//数据类型为json格式,String jsonStr = "{\"username\":\"lisi\",\"nickname\":\"李四\"}";//json数据.RequestBody body = RequestBody.create(JSON, jsonStr);Request request = new Request.Builder().url("http://www.baidu.com").post(body).build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {
//请求成功的回调if(response.isSuccessful()){//回调的方法执行在子线程。Log.d("kwwl","post异步获取数据成功了");Log.d("kwwl","post异步response.code()=="+response.code());Log.d("kwwl","post异步response.body().string()=="+response.body().string());}}});}}).start();}//    使用RequestBody传递File对象,private void postyibuJsonDataWithParame() {new Thread(new Runnable() {@Overridepublic void run() {OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。MediaType fileType = MediaType.parse("File/*");//数据类型为json格式,File file = new File("path");//file对象.RequestBody body = RequestBody.create(fileType , file );Request request = new Request.Builder().url("http://www.baidu.com").post(body).build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {
//请求成功的回调if(response.isSuccessful()){//回调的方法执行在子线程。Log.d("kwwl","post异步获取数据成功了");Log.d("kwwl","post异步response.code()=="+response.code());Log.d("kwwl","post异步response.body().string()=="+response.body().string());}}});}}).start();}//   使用MultipartBody同时传递键值对参数和File对象,FromBody传递的是字符串型的键值对,RequestBody传递的是多媒体,那么如果我们想二者都传递怎么办?此时就需要使用MultipartBody类。private void postyibuFileAndJsonDataWithParame() {new Thread(new Runnable() {@Overridepublic void run() {OkHttpClient client = new OkHttpClient();File file=new File("路径名");MultipartBody multipartBody =new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("groupId","idone")//添加键值对参数.addFormDataPart("title","title").addFormDataPart("file","文件名",RequestBody.create(MediaType.parse("file/*"), file))//添加文件.build();final Request request = new Request.Builder().url("http://").post(multipartBody).build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {
//请求成功的回调if(response.isSuccessful()){//回调的方法执行在子线程。Log.d("kwwl","post异步获取数据成功了");Log.d("kwwl","post异步response.code()=="+response.code());Log.d("kwwl","post异步response.body().string()=="+response.body().string());}}});}}).start();}//自定义RequestBody实现流的上传,只要是RequestBody类以及子类都可以作为post方法的参数,下面我们就自定义一个类,继承RequestBody,实现流的上传。private void postyibuAudefineRequestBodyDataWithParame() {RequestBody body = new RequestBody() {@Overridepublic MediaType contentType() {return null;}@Overridepublic void writeTo(BufferedSink sink) throws IOException {//重写writeTo方法FileInputStream fio= new FileInputStream(new File("fileName"));byte[] buffer = new byte[1024*8];if(fio.read(buffer) != -1){sink.write(buffer);}}};new Thread(new Runnable() {@Overridepublic void run() {OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。Request request = new Request.Builder().url("http://www.baidu.com").post(body).build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {
//请求成功的回调if(response.isSuccessful()){//回调的方法执行在子线程。Log.d("kwwl","post异步获取数据成功了");Log.d("kwwl","post异步response.code()=="+response.code());Log.d("kwwl","post异步response.body().string()=="+response.body().string());}}});}}).start();}//    //下载, 在OKHttp中并没有提供下载文件的功能,但是在Response中可以获取流对象,有了流对象我们就可以自己实现文件的下载。代码如下:这段代码写在回调接口CallBack的onResponse方法中:
//    public void download() {
//
//
//                try {
//                    InputStream is = response.body().byteStream();//从服务器得到输入流对象
//                    long sum = 0;
//                    File dir = new File(mDestFileDir);
//                    if (!dir.exists()) {
//                        dir.mkdirs();
//                    }
//                    File file = new File(dir, mdestFileName);//根据目录和文件名得到file对象
//                    FileOutputStream fos = new FileOutputStream(file);
//                    byte[] buf = new byte[1024 * 8];
//                    int len = 0;
//                    while ((len = is.read(buf)) != -1) {
//                        fos.write(buf, 0, len);
//                    }
//                    fos.flush();
//
//                }
//    }

=======afinal中的FinalHttp===========

OKHttp中设置请求头特别简单,在创建request对象时调用一个方法即可。

Request request = new Request.Builder() .url("http://www.baidu.com") .header("User-Agent", "OkHttp Headers.java") .addHeader("token", "myToken") .build();

android之网络请求框架OKhttp、原生http请求相关推荐

  1. android 设置允许http请求_网络请求框架----OkHttp原理

    一.前言 在 Android 中,网络请求是一个必不可少的功能,因此就有许多代表网络请求客户端的组件库,具有代表性的有下面三种: Apache 的 HTTP 客户端组件 HttpClient. Jav ...

  2. 原生ajax请求的封装

    原生ajax请求的封装 原生ajax请求分为四步: 1.创建请求对象 判断浏览器的兼容问题 ie浏览器:window.ActiveXObject 常用浏览器:window.XMLHttpRequest ...

  3. okhttp的应用详解与源码解析--android网络请求框架发展史

    乘5G之势,借物联网之风,Android未来亦可期,Android优势在于开放,手机.平板.车载设备.智能家居等都是Android的舞台,Google不倒,Android不灭,本专栏的同步视频教程已经 ...

  4. Android中网络请求框架的封装-Retrofit+RxJava+OkHttp

    Retrofit注解 请求方法 注解代码 请求格式 @GET GET请求 @POST POST请求 @DELETE DELETE请求 @HEAD HEAD请求 @OPTIONS OPTIONS请求 @ ...

  5. android okgo 网络请求框架

    OkGo - OkHttpUtils-2.0.0升级后改名 OkGo,全新完美支持RxJava 项目地址:https://github.com/jeasonlzy,欢迎star,欢迎issue 该库是 ...

  6. 流行框架(二)网络请求库 OKhttp

    文章目录 概述 HttpURLConnection GET和POST获取文本数据 GET POST OKHttp 基本使用 依赖与权限 发起一个get请求 重要概念 OkHttpClient Requ ...

  7. android post请求_Vue 网络请求框架 axios 使用教程

    点击上方"代码集中营",设为星标 优秀文章,第一时间送达! 前期回顾 1. Vue 学习入门指南 2. Vue 入门环境搭建 3. Visual Studio Code 使用指南 ...

  8. Android之解剖网络请求框架Volley

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! Volley介绍 Volley是Google推出的网络请求库,包含的特性有JSON ...

  9. 老牛知点所以然-两种安卓两种网络请求框架(ksoap2-android okhttp)配置https

    什么是HTTPS 关于https与http的区别,耳朵都快被磨出茧子了,但是除了知道这玩意比http更安全之外,SSL握手阶段,到底发生了什么,也说不出一个具体的所以然来.囫囵了几篇关于安卓客户端不同 ...

最新文章

  1. 【数据结构】堆,大根堆,小根堆,优先队列 详解
  2. Azure:不能把同一个certificate同时用于Azure Management和RDP
  3. bzoj 3687: 简单题
  4. sdut 2135 数据结构实验之队列一:排队买饭
  5. 分布式之系统底层原理
  6. css居中的几种方法_CSS几种常用的水平垂直居中对齐方法
  7. 组织管理插件-代码自动补全-语法检查等特性-SpaceVim v1.5.0
  8. web面试 new操作符到底干了什么?
  9. CVE-2014-6332学习笔记
  10. 给你的站点添加 DNS CAA 保护
  11. wap精武堂源码php_仿qq家园游戏源码wap文字游戏源码wap游戏源码
  12. 关于新APP,从交底书入手
  13. POSTman安装步骤
  14. 手机端开发(uni-app、vant、mui)优缺点分析
  15. 商业网站建设和运营的四度:Approachability、Usability、 Accessibility 和 Profitability...
  16. 无线桥接后如何进入副路由器的页面?
  17. leetcode 799. 香槟塔 (Champagne Tower)
  18. 快手短视频怎么同步到头条?
  19. pc模式 华为mate30_华为Mate30系列10个隐藏黑科技
  20. tcl/tk sample.dll cannot be unloaded under a trusted interpreter

热门文章

  1. AVL树(艾薇儿树)
  2. 南明区聚焦大数据产业助推经济转型升级纪实
  3. Java——SystemTray系统托盘
  4. 大数据——大数据默认端口号列表
  5. 毕业论文 | 基于51单片机的自动报警设计(烟雾报警)
  6. 没有安装python的电脑能运行python程序吗_电脑没有安装python运行它的文件
  7. UGUI-- Mask遮罩
  8. 深入浅出说智图—POW矿池篇
  9. 编译原理 - 1 手撸状态机词法分析器
  10. mysql 查找 法语字母,法语撇号字符在mysql数据库?