栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android-Okhttp的使用解析

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android-Okhttp的使用解析

okhttp是Android6.0推出的网络框架。由于谷歌在Android6.0的之后,将HttpClient相关属性取消掉,导致Volley框架不能正常使用。所以才有了今天的Okhttp。

 Okhttp进行网络访问通常有两种方式,一种是get请求,还有一种叫做post请求。

1、OKhttp的get请求

通常,我们使用get方式来请求一个网站,是依靠url地址的。Okhttp使用get方式来请求网站通常有如下的步骤:

A、创建OkhttpClient的变量,这个变量相当于是一个全局的执行者。主要的网络操作是依靠它来进行的。

B、创建一个builder对象。

C、利用builder对象创建一个Request对象。

D、使用全局执行者来创建一个Call对象。

E、通过Call对象来进行网络连接。

public void doGet(View view)
  {
    Request.Builder builder = new Request.Builder();
    Request request = builder.get().url(urlString + "userName=pby&userPassword=123").build();
    Call newCall = mOkHttpClient.newCall(request);
    //newCall.execute()
    newCall.enqueue(new Callback() {
      @Override
      public void onFailure(Request request, IOException e) {
 L.e("失败了");
      }

      @Override
      public void onResponse(Response response) throws IOException {
 String string = response.body().string();
 L.e(string);
      }
    });
  }

2、Okhttp的Post请求

Post请求与get请求有些不一样。get请求主要的功能是从服务器上获取数据,而Post请求则是向服务器提交数据。

public void doPost(View view)
  {
    FormEncodingBuilder requestBodyBuilder = new FormEncodingBuilder();
    RequestBody requestBody = requestBodyBuilder.add("userName", "pby").add("userPassword", "123").build();
    Request.Builder builder = new Request.Builder();
    Request request = builder.url(urlString).post(requestBody).build();
    Call newCall = mOkHttpClient.newCall(request);
    executeCall(newCall);
  }

3、服务器端接收客户端传过来的字符串

客户端的代码:

public void doPostString(View view)
  {
    RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain;charset = utf-8"), "{name = pby, password = 1234}");
    Request.Builder builder = new Request.Builder();
    Request request = builder.url(urlString + "doPostString").post(requestBody).build();
    Call newCall = mOkHttpClient.newCall(request);
    executeCall(newCall);
  }

服务器端的代码:

public String doPostString() throws IOException
  {
    HttpServletRequest request = ServletActionContext.getRequest();
    ServletInputStream inputStream = request.getInputStream();
    StringBuilder sb = new StringBuilder();
    int len = 0;
    byte []buff = new byte[1024];
    while((len = inputStream.read(buff)) != -1)
    {
      sb.append(new String(buff, 0, len));
    }
    System.out.println(sb.toString());
    return null;
  }

服务器端如果要接收客户端的数据,则需要接收request;如果服务器端想要给客户端传数据,则需要通过response来传递。

4、使用post方式进行文件的传输

客户端的代码

public void doPost(View view)
  {
    FormEncodingBuilder requestBodyBuilder = new FormEncodingBuilder();
    RequestBody requestBody = requestBodyBuilder.add("userName", "pby").add("userPassword", "123").build();
    Request.Builder builder = new Request.Builder();
    Request request = builder.url(urlString + "login").post(requestBody).build();
    Call newCall = mOkHttpClient.newCall(request);
    executeCall(newCall);
  }

关于选择文件的代码--抄袭网络上的代码,并不是自己写的

private void showFileChooser() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*

public class CountingRequestBody extends RequestBody {
  private RequestBody delegate = null;
  private MyListener mListener= null;
  private CountingSink mCountSink = null;
  public interface MyListener
  {
    void onRequestProgress(int byteWriteCount, int TotalCount);
  }
  public CountingRequestBody(RequestBody requestBody, MyListener listener)
  {
    delegate = requestBody;
    mListener = listener;
  }
  @Override
  public MediaType contentType() {
    return delegate.contentType();
  }

  @Override
  public void writeTo(BufferedSink sink) throws IOException {
    mCountSink = new CountingSink(sink);
    BufferedSink bs = Okio.buffer(mCountSink);
    delegate.writeTo(bs);
    bs.flush();
  }
  private class CountingSink extends ForwardingSink{
    private int byteWriteCount = 0;
    public CountingSink(Sink delegate) {
      super(delegate);
    }

    @Override
    public void write(Buffer source, long byteCount) throws IOException {
      super.write(source, byteCount);
      byteWriteCount += byteCount;
      mListener.onRequestProgress(byteWriteCount, (int) contentLength());
    }
  }

  @Override
  public long contentLength() throws IOException {
    return delegate.contentLength();
  }
}

MultipartBuilder multipartBuilder = new MultipartBuilder();
    RequestBody requestBody = multipartBuilder.type(MultipartBuilder.FORM)
 .addFormDataPart("userName", "pby")
 .addFormDataPart("userPassword", "123")
 .addFormDataPart("mFile", file.getName(), RequestBody.create(MediaType.parse("application/octet-stream"), file)).build();
    CountingRequestBody countingRequestBody = new CountingRequestBody(requestBody, new CountingRequestBody.MyListener() {
      @Override
      public void onRequestProgress(int byteWriteCount, int TotalCount) {
 L.e(byteWriteCount + " / " + TotalCount);
      }
    });
    Request.Builder builder = new Request.Builder();
    Request request = builder.url(urlString + "doUpLoadFile").post(countingRequestBody).build();
    //Request request = builder.url(urlString + "doUpLoadFile").post(requestBody).build();
    Call newCall = mOkHttpClient.newCall(request);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/159405.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号