okhttp的使用以及 post json进行请求数据

一、在build.gradlet添加

         compile 'com.squareup.okhttp3:okhttp:3.8.1'

         compile 'com.squareup.okio:okio:1.13.0'

二、添加使用权限

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

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

三、建一个简单的请求工具类

import android.os.Handler;
import android.os.Message;
import android.util.Log;


import com.google.gson.Gson;
import com.google.gson.GsonBuilder;


import java.io.IOException;
import java.util.Map;


import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;


/**
 * Created by admin on 2018/4/25.
 */


public class OkHttpUtils {


    private static final String TAG = OkHttpUtils.class.getSimpleName();


    public static final MediaType JSON
            = MediaType.parse("application/json; charset=utf-8");
    private static final int GET = 1;
    private static final int POSTJSON = 2;
    private OkHttpClient client = new OkHttpClient();
    private static OkHttpUtils instance;
    private OkHttpUtils(){
    }


    public static OkHttpUtils getInstance(){
        if (instance == null){
            instance = new OkHttpUtils();
        }
        return instance;
    }




    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case GET:
                    Log.i(TAG,"GET---->"+(String) msg.obj);
                    break;


                case POSTJSON:
                    Log.i(TAG, "POSTJSON---->"+(String) msg.obj + msg.arg1);
                    break;
            }
        }
    };


    /**
     *
     * @param url 请求地址
     * @return
     * @throws IOException
     */
    private String get(String url) throws IOException {
        Request request = new Request.Builder().url(url).build();


        Response response = client.newCall(request).execute();


        return response.body().string();
    }


    /**
     *
     * @param url 请求地址
     * @param json json字符串请求参数
     * @return
     * @throws IOException
     */
    public String postJson(String url, String json) throws IOException {
        RequestBody body = RequestBody.create(JSON, json);
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        Response response = client.newCall(request).execute();
        //response.body().string()这一句代码在方法体里面只能用一次(包括打印输出的使用)
        return response.body().string();


    }


    /**
     * @param url  请求地址
     */
    public void requestDataFromeGet(final String url) {
        new Thread() {
            @Override
            public void run() {
                super.run();
                try {
                    String result = get(url);
                    Message message = Message.obtain();
                    message.what = GET;
                    message.obj = result;
                    handler.sendMessage(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();


    }


    /**
     *
     * @param url 请求地址
     * @param map 请求参数(把map转换成gson)
     */


    public void rquestDataFromePostJson(final String url, final Map<String, Object> map) {
      new Thread(){
          @Override
          public void run() {
              super.run();
              try {
                  //Map转JSON数据
                  Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
                  String result = postJson(url, gson.toJson(map));
                  Log.i(TAG,gson.toJson(map));
                  Message message = Message.obtain();
                  message.what = POSTJSON;
                  message.obj = result;
                  handler.sendMessage(message);
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }.start();
    }

 

}

四、简单的调用

import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;


import com.example.admin.currentdatetime.utils.OkHttpUtils;


import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;


public class OkHttpActivity extends AppCompatActivity {




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ok_http);
        OkHttpUtils okHttpUtils = OkHttpUtils.getInstance();
        okHttpUtils.requestDataFromeGet("http://www.baidu.com");
        final Map<String, Object> map = new HashMap<>();
        map.put("machine_mac", getMacAddress(this));
        map.put("machine_ip", getIPAddress());
        map.put("win_num", "0033");
        okHttpUtils.rquestDataFromePostJson("https://", map);
    }


    //获取MAC地址
    public String getMacAddress(Context context) {
        WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        WifiInfo info = wifi.getConnectionInfo();
        return info.getMacAddress();
    }


    //获取IP地址
    public static String getIPAddress() {


        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
                NetworkInterface intf = en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress() && (inetAddress instanceof Inet4Address)) {
                        return inetAddress.getHostAddress().toString();
                    }
                }
            }
        } catch (SocketException ex) {
            ex.printStackTrace();
        }
        return null;
    }
}

五、OkHttp使用的一些小坑

1、如果把get方法或者postJson的方法里面的response.body().string();写成response.body().toString();

返回的不是数据而是实例化对象okhttp3.internal.http.RealResponseBody@419a38380

2、response.body().string();只能使用一次。不然会报一个错误如下

为了方便使用进行Okhttp的二次封装:https://blog.csdn.net/u011905195/article/details/85333049

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用OkHttp3可以通过POST请求发送JSON数据。需要将JSON数据转化为RequestBody,然后通过Request.Builder来构建请求对象,最后使用OkHttpClient发送请求即可。具体实现方法可以参考OkHttp3的官方文档或者相关的教程资料。 ### 回答2: OkHttp是一种流行的HTTP客户端库,用于在Android应用程序中处理http请求json是一种轻量级的数据交换格式,常用于web应用程序间的数据传输。 在Android中使用OkHttp3发送post请求,包括以下几个步骤: 1.在Android Studio的build.gradle(Module:app)中添加以下依赖项: ``` implementation 'com.squareup.okhttp3:okhttp:3.12.0' ``` 2.在需要发送post请求的Activity的java文件中,导入以下包: ``` import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; ``` 3.在需要发送post请求的Activity中添加以下代码,其中JSON_DATA_STRING为要发送的Json格式数据: ``` public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); OkHttpClient client = new OkHttpClient(); RequestBody body = RequestBody.create(JSON, JSON_DATA_STRING); Request request = new Request.Builder() .url(url) .post(body) .build(); Response response = client.newCall(request).execute(); ``` 在上述代码中,首先创建了一个OkHttpClient对象,用于构建请求、发送请求并接收响应。使用RequestBody对象将需要发送的Json数据设置到HTTP 请求的Body中。Request.Builder()是用来构建一个HTTP请求的实例,参数url为请求的地址,HTTPRequest的类型为POST请求Header中包含JSON数据和Content-Type,然后将RequestBody对象信息设置到请求对象中。 构造完成后,调用client.newCall(request).execute()来发送请求并获取响应信息。需要注意的是,由于Android 是基于Linux内核编译的,如果在主线程中执行网络请求,容易造成网络等待导致系统反应迟缓或出现 ANR(App Not Responding)异常,因此网络请求必须在子线程中执行。 以上就是使用OkHttp3对Android应用程序中的Json数据进行post请求的完整过程。开发者可以根据自己的需求进行相应的修改和调整。 ### 回答3: OkHttp是一个流行的HTTP客户端,用于与后端API进行通信。Post请求是向后端API传递数据的常见方式之一。本文将介绍如何使用OkHttp3进行Post请求并传输json数据。 首先,我们需要在项目中添加OkHttp3依赖,可以在Gradle文件中添加以下行: ```gradle implementation 'com.squareup.okhttp3:okhttp:4.9.2' ``` 接下来,我们需要创建一个OkHttpClient对象: ```kotlin val client = OkHttpClient() ``` 创建一个RequestBody对象,并将json字符串作为参数传入: ```kotlin val json = "{ \"name\": \"张三\", \"age\": 28 }" val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json) ``` 然后创建一个Request对象,将RequestBody对象添加到请求中: ```kotlin val request = Request.Builder() .url("https://example.com/api/user") .post(body) .build() ``` 这里设置了请求的url和method为'post',并将之前创建的RequestBody对象添加到请求中。接下来,使用OkHttpClient对象来发送请求: ```kotlin client.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { // 处理请求失败的情况 } override fun onResponse(call: Call, response: Response) { // 处理请求成功的情况 val result = response.body()?.string() // 获取响应的数据 } }) ``` 使用newCall方法创建一个Call对象,并使用enqueue方法将回调函数添加到请求中。回调函数包含两个方法:onFailure和onResponse。如果请求失败,onFailure方法将被调用,并将异常作为参数传递给它。如果请求成功,onResponse方法将被调用,并将响应作为参数传递给它。我们可以通过调用响应对象的body()方法来获取响应的数据。 到此为止,我们已经完成了使用OkHttp3进行Post请求并传输json数据的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值