HttpConnection

HTTP与OkHttp网络请求详解
本文详细介绍了使用Java进行网络请求的方法,包括通过HttpURLConnection发送GET和POST请求的具体实现,以及利用OkHttp3库执行GET和POST请求的步骤。文章提供了完整的代码示例,展示了如何设置请求参数、处理响应数据,并解释了关键代码的作用。

1.HttpConnection 用于接受和发送网络数据

网络操作必须新开个子线程执行,否则会出现 ANR(Application Not Response) 应用无响应异常
Get:
 /**
   * 通过HttpURLConnection 获取输入流
   */   
 public static InputStream getInputStreamFromWebSite(String path) {

        InputStream inputStream = null;
        try {
            //创建URL对象指定我们要访问的网址(路径)
            URL url = new URL(path);
            //创建HttpurlConnection 对象
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //设置发送 get 请求
            conn.setRequestMethod("GET");
            //设置请求超时时间
            conn.setConnectTimeout(5000);
            //访问成功
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                inputStream = conn.getInputStream();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return inputStream;
    }
Post: 通过请求提的方式把数据传给服务器(以流的形式)
/**
 * 通过HttpURLConnection 上传数据
 */
public static InputStream postDataToWebAPI(String path,String data) {

    InputStream inputStream = null;
    try {
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setConnectTimeout(5000);
        conn.setReadTimeout(5000);

        //设置请求头信息
        conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
        conn.setRequestProperty("Content-Length",String.valueOf(data.length()));
      
        //将拼接好的数据已流的形式提交给数据库
        conn.setDoOutput(true);//设置一个标记,允许输出
        conn.getOutputStream().write(data.getBytes());

        int code=conn.getResponseCode();
        Tools.log("ResponseCode:"+String.valueOf(code));
        if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
            //获取返回结果
            inputStream = conn.getInputStream();
        }
        conn.disconnect();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return inputStream;
}

重点

  //将拼接好的数据已流的形式提交给数据库
        conn.setDoOutput(true);//设置一个标记,允许输出
        conn.getOutputStream().write(data.getBytes());

2. okHttp3

(1)创建 get post 方法
  /**
     * 通过okHttp3 执行 get
     */
    public static void getDataByOkHttp(String path, Callback callback) {

        //创建okHttpClient对象
        OkHttpClient mOkHttpClient = new OkHttpClient();
        //创建一个Request
        Request request = new Request.Builder()
                .url(path)
                .build();

        //new call
        okhttp3.Call call = mOkHttpClient.newCall(request);
        //请求加入调度
        call.enqueue(callback);
    }

    /**
     * 通过okHttp3 执行 post
     */
    public static void postDataToServerByOkHttp(String url, RequestBody formBody, Callback callback)  {

        OkHttpClient mOkHttpClient=new OkHttpClient();

        Request request=new Request.Builder()
                .url(url)
                .post(formBody)  //数据
                .build();

        mOkHttpClient.newCall(request).enqueue(callback); //回调
    }

(2)调用

onResponse() 方法时执行在子线程当中的

NetUtils.getDataByOkHttp(url, new Callback() {

    @Override
    public void onFailure(Call call, IOException e) {

    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {

        String result=response.body().string();
    }
});
       FormBody body = new FormBody.Builder()
                .add("Name", name).add("PhoneNumber", phone).add("Gender", gender).add("Passwords", pwd)
                .add("RoleId", "1").add("Image", image).build();

        NetUtils.postDataToServerByOkHttp(APIPaths.USER_REGISTER, body, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                Log.i(TAG, "onResponse: " + response.body().string());
            }
        });

转载于:https://www.cnblogs.com/-Tiger/p/7275843.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值