使用OKHttp3が要求を取得し、ファイルをアップロードするための要求を投稿

OKHttpClientを作成するには1つの最初の必要性

新しいを指示することができます。

OkHttpClientクライアント=新しいOkHttpClient()が
構築するために多くのビルダーのである(addInterceptorメソッドは、インターセプタを追加することであるということはできない書き込み、Sogouの特定の百度、ビング、)

プライベートボイドbuildHttpClient(){
this.client =新しいOkHttpClient.Builder()
.addInterceptor(新しいインターセプタ(){
公共応答インターセプト(チェーン鎖)のIOException {スロー
リクエスト要求= chain.requestを();
応答レスポンス= chain.proceed(要求);
戻り応答;
}
})
.connectTimeout(4000、TimeUnit.MILLISECONDS)
.readTimeout(4000、TimeUnit.MILLISECONDS)
.writeTimeout(4000、TimeUnit.MILLISECONDS)
.build();
}
2 GET请求

プライベート無効のget(){
/ *如果需要参数、在URL后边拼接:?A = AAA&= BBB ... * / B
要求の要求=新しいRequest.Builder()URL(「http://192.168.10.117:8080/test。 「))(.build。
client.newCall(リクエスト).enqueue(新しいコールバック(){
公共空onResponse(通話呼び出し、最終応答レスポンスが)のIOException {スロー
最終文字列の結果を= response.body()文字列();
最終ブールOK = response.isSuccessful( );
runOnUiThread(新しいRunnableを(){
公共ボイドラン(){
Toast.makeText(OKHttpActivity.this、その結果、Toast.LENGTH_SHORT).SHOW();
}
});
}
公共ボイドONFAILURE(コールコールは、IOException電子){
runOnUiThread(新しいRunnableを(){
ます。public void実行(){
Toast.makeText(OKHttpActivity.this、「エラー」、Toast.LENGTH_SHORT).SHOW();
}
})。
}
})。
}
3 POST请求

プライベート無効ポスト(){
FormBody.Builderビルダー=新しいFormBody.Builder();
/ *添加两个参数* /
builder.add(「P」、「我勒个去」).add(「」、「こんにちは」);
FormBody本体= builder.build()。
。要求要求=新しいRequest.Builder()URL(「http://192.168.10.117:8080/test」).post(ボディ).build();

/* 下边和get一样了 */  
client.newCall(request).enqueue(new Callback() {  
    public void onResponse(Call call, Response response) throws IOException {  
        final  String bodyStr = response.body().string();  
        final boolean ok = response.isSuccessful();  
        runOnUiThread(new Runnable() {  
            public void run() {  
                if(ok){  
                    Toast.makeText(OKHttpActivity.this, bodyStr, Toast.LENGTH_SHORT).show();  
                }else{  
                    Toast.makeText(OKHttpActivity.this, "server error : " + bodyStr, Toast.LENGTH_SHORT).show();  
                }  
            }  
        });  
    }  
    public void onFailure(Call call,final IOException e) {  
        runOnUiThread(new Runnable() {  
            public void run() {  
                Toast.makeText(OKHttpActivity.this, "error : "+e.toString(), Toast.LENGTH_SHORT).show();  
            }  
        });  
    }  
});  

4複数ファイルのアップロード

プライベート無効upFile(){
/ *第一个要上传的ファイル* /
ファイルfile1 =新しいファイル(Environment.getExternalStorageDirectory()getAbsolutePath()+「/a.jpg」。);
RequestBody fileBody1 = RequestBody.create(MediaType.parse(「アプリケーション/オクテットストリーム」)、FILE1)。
文字列file1Name =「testFile1.txt」。

/* 第二个要上传的文件,这里偷懒了,和file1用的一个图片 */  
File file2 = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/a.jpg");  
RequestBody fileBody2 = RequestBody.create(MediaType.parse("application/octet-stream") , file2);  
String file2Name = "testFile2.txt";  


/* form的分割线,自己定义 */  
String boundary = "xx--------------------------------------------------------------xx";  

MultipartBody mBody = new MultipartBody.Builder(boundary).setType(MultipartBody.FORM)  
        /* 上传一个普通的String参数 , key 叫 "p" */  
        .addFormDataPart("p" , "你大爷666")  
        /* 底下是上传了两个文件 */  
        .addFormDataPart("file" , file1Name , fileBody1)  
        .addFormDataPart("file" , file2Name , fileBody2)  
        .build();  

/* 下边的就和post一样了 */  
Request request = new Request.Builder().url("http://192.168.10.117:8080/test").post(mBody).build();  
client.newCall(request).enqueue(new Callback() {  
    public void onResponse(Call call, Response response) throws IOException {  
        final  String bodyStr = response.body().string();  
        final boolean ok = response.isSuccessful();  
        runOnUiThread(new Runnable() {  
            public void run() {  
                if(ok){  
                    Toast.makeText(OKHttpActivity.this, bodyStr, Toast.LENGTH_SHORT).show();  
                }else{  
                    Toast.makeText(OKHttpActivity.this, "server error : " + bodyStr, Toast.LENGTH_SHORT).show();  
                }  
            }  
        });  
    }  
    public void onFailure(Call call, final IOException e) {  
        runOnUiThread(new Runnable() {  
            public void run() {  
                Toast.makeText(OKHttpActivity.this, e.toString(), Toast.LENGTH_SHORT).show();  
            }  
        });  
    }  
});  

}
2つの単純なパッケージ

直接使用後の使用を容易にするためのツールにokhttp3シンプルな包装。

okhttpバージョンは次のとおりです。

コンパイル「com.squareup.okhttp3:okhttp:3.8.1」
1。
機能のようなツールのか、次のように:

要求、ネットワークデータに同期モードのアクセスを取得
ポスト要求、同期データ取得
を非同期ネットワークデータを取得し、GETリクエストを
非同期にデータを取得するためのPOSTリクエスト
自動的にスキップし、HTTPSリクエストをサポートする証明書の検証が
決定し、現在、利用可能なネットワークかどうかを
前記ポストが提出した要求キーと値のペア<文字列、文字列>

  1. 完全なコード

輸入android.content.Context;
輸入android.net.ConnectivityManager;
輸入android.net.NetworkInfo;
輸入android.util.Log;

インポートにjava.io.IOException;
インポートにjava.security.SecureRandom;
輸入java.security.cert.CertificateException。
輸入はjava.security.cert.X509Certificate;
インポートするjava.util.Iterator;
輸入java.util.Map;
輸入java.util.concurrent.TimeUnit。

輸入javax.net.ssl.HostnameVerifier;
輸入javax.net.ssl.SSLContext;
輸入javax.net.ssl.SSLSession。
輸入javax.net.ssl.SSLSocketFactory;
輸入javax.net.ssl.TrustManager;
輸入javax.net.ssl.X509TrustManager;

輸入okhttp3.Call;
輸入okhttp3.Callback;
輸入okhttp3.OkHttpClient。
輸入okhttp3.Request;
輸入okhttp3.RequestBody。
輸入okhttp3.Response。

/ **

  • 2017年7月12日にfxjzzyoによって作成されました。
    * /

パブリッククラスNetUtils {
プライベート静的最後のバイト[]ロッカー=新しいバイト[0]。
プライベート静的NetUtils mInstance。
プライベートOkHttpClient mOkHttpClient。

private NetUtils() {
    okhttp3.OkHttpClient.Builder ClientBuilder=new okhttp3.OkHttpClient.Builder();
    ClientBuilder.readTimeout(20, TimeUnit.SECONDS);//读取超时
    ClientBuilder.connectTimeout(6, TimeUnit.SECONDS);//连接超时
    ClientBuilder.writeTimeout(60, TimeUnit.SECONDS);//写入超时
    //支持HTTPS请求,跳过证书验证
    ClientBuilder.sslSocketFactory(createSSLSocketFactory());
    ClientBuilder.hostnameVerifier(new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    });
    mOkHttpClient=ClientBuilder.build();
}

/**
 * 单例模式获取NetUtils
 * @return
 */
public static NetUtils getInstance() {
    if (mInstance == null) {
        synchronized (LOCKER) {
            if (mInstance == null) {
                mInstance = new NetUtils();
            }
        }
    }
    return mInstance;
}

/**
 * get请求,同步方式,获取网络数据,是在主线程中执行的,需要新起线程,将其放到子线程中执行
 * @param url
 * @return
 */
public  Response getDataSynFromNet(String url) {
    //1 构造Request
    Request.Builder builder = new Request.Builder();
    Request request=builder.get().url(url).build();
    //2 将Request封装为Call
    Call call = mOkHttpClient.newCall(request);
    //3 执行Call,得到response
    Response response = null;
    try {
        response = call.execute();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return response;
}
/**
 * post请求,同步方式,提交数据,是在主线程中执行的,需要新起线程,将其放到子线程中执行
 * @param url
 * @param bodyParams
 * @return
 */
public  Response postDataSynToNet(String url,Map<String,String> bodyParams) {
    //1构造RequestBody
    RequestBody body=setRequestBody(bodyParams);
    //2 构造Request
    Request.Builder requestBuilder = new Request.Builder();
    Request request = requestBuilder.post(body).url(url).build();
    //3 将Request封装为Call
    Call call = mOkHttpClient.newCall(request);
    //4 执行Call,得到response
    Response response = null;
    try {
        response = call.execute();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return response;
}
/**
 * 自定义网络回调接口
 */
public interface MyNetCall{
    void success(Call call, Response response) throws IOException;
    void failed(Call call, IOException e);
}

/**
 * get请求,异步方式,获取网络数据,是在子线程中执行的,需要切换到主线程才能更新UI
 * @param url
 * @param myNetCall
 * @return
 */
public  void getDataAsynFromNet(String url, final MyNetCall myNetCall) {
    //1 构造Request
    Request.Builder builder = new Request.Builder();
    Request request=builder.get().url(url).build();
    //2 将Request封装为Call
    Call call = mOkHttpClient.newCall(request);
    //3 执行Call
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            myNetCall.failed(call,e);
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            myNetCall.success(call,response);

        }
    });
}

/**
 * post请求,异步方式,提交数据,是在子线程中执行的,需要切换到主线程才能更新UI
 * @param url
 * @param bodyParams
 * @param myNetCall
 */
public  void postDataAsynToNet(String url, Map<String,String> bodyParams, final MyNetCall myNetCall) {
    //1构造RequestBody
    RequestBody body=setRequestBody(bodyParams);
    //2 构造Request
    Request.Builder requestBuilder = new Request.Builder();
    Request request = requestBuilder.post(body).url(url).build();
    //3 将Request封装为Call
    Call call = mOkHttpClient.newCall(request);
    //4 执行Call
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            myNetCall.failed(call,e);
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            myNetCall.success(call,response);

        }
    });
}
/**
 * post的请求参数,构造RequestBody
 * @param BodyParams
 * @return
 */
private RequestBody setRequestBody(Map<String, String> BodyParams){
    RequestBody body=null;
    okhttp3.FormBody.Builder formEncodingBuilder=new okhttp3.FormBody.Builder();
    if(BodyParams != null){
        Iterator<String> iterator = BodyParams.keySet().iterator();
        String key = "";
        while (iterator.hasNext()) {
            key = iterator.next().toString();
            formEncodingBuilder.add(key, BodyParams.get(key));
            Log.d("post http", "post_Params==="+key+"===="+BodyParams.get(key));
        }
    }
    body=formEncodingBuilder.build();
    return body;

}

/**
 * 判断网络是否可用
 * @param context
 * @return
 */
public static boolean isNetworkAvailable(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    if (cm == null) {
    } else {
  //如果仅仅是用来判断网络连接
  //则可以使用cm.getActiveNetworkInfo().isAvailable();
        NetworkInfo[] info = cm.getAllNetworkInfo();
        if (info != null) {
            for (int i = 0; i < info.length; i++) {
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
    }
    return false;
}
/**
 * 生成安全套接字工厂,用于https请求的证书跳过
 * @return
 */
public SSLSocketFactory createSSLSocketFactory() {
    SSLSocketFactory ssfFactory = null;
    try {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom());
        ssfFactory = sc.getSocketFactory();
    } catch (Exception e) {
    }
    return ssfFactory;
}
/**
 * 用于信任所有证书
 */
class TrustAllCerts implements X509TrustManager {
    @Override
    public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
    }
    @Override
    public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

    }
    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return new X509Certificate[0];
    }
}

}

  1. 使用例

私たちは、それがあったようにネットワーク要求が自動的に子スレッドを入れて、少し楽にそれで、非同期要求を使用することをお勧めします。同期要求は、独自の新しいスレッド+の行うためのハンドラ、およびネットワークへの元の要求との間にほとんど差が必要です。したがって、この例では、非同期リクエストを挙げることができます。

非同期GETリクエスト

ボタンをクリックしてログイン

空公共ログイン(ビュービュー){
最終的な文字列のアカウント= etAccount.getText()のtoString();.
最終パス= etPassword.getText文字列()のtoString();.
IF(account.isEmpty()|| pass.isEmpty() ){
Toast.makeTextが(これは、 "ユーザー名またはパスワードが空白ではありません!"、Toast.LENGTH_SHORT).SHOW();
戻り値;
}
IFは(Global.isNetAvailable)!
{
Toast.makeTextは(これは、「ネットワークが利用できません! 」、Toast.LENGTH_SHORT).SHOW();
戻り値;
}
//プログレスバー
loginProgress.setVisibility(View.VISIBLE);
//取得するネットワークツールのクラスのインスタンス
netUtils netUtils NetUtils.getInstance =();
//は、ネットワーク、コードを要求GET
netUtils.getDataAsynFromNet(Global.LOGIN + "?ユーザ名=" +アカウント+ "&パスワード=" +パス、
新しい新NetUtils.MyNetCall(){
@Override
ます。public void成功(通話呼び出し、レスポンス応答)のIOException {スロー
Log.i(「タグ」、「成功」)。
文字列結果= response.body()文字列()。
最終ResponseBean responseBean = JSON.parseObject(その結果、ResponseBean.class)。

                   if (responseBean != null) {
                       runOnUiThread(new Runnable() {
                           @Override
                           public void run() {
                               loginProgress.setVisibility(View.GONE);
                               String errcode = responseBean.getErrcode();
                               if (errcode.equals("0")) {//登录成功
                                   //记录学号
                                   Global.account = account;
                                   //存储用户名密码
                                   saveUserName(account, pass);

                                   Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                                   startActivity(intent);
                                   LoginActivity.this.finish();
                               } else {
                                   Toast.makeText(LoginActivity.this, "请求失败!错误代码: " + errcode, Toast.LENGTH_SHORT).show();
                               }

                           }
                       });

                   }
               }

               @Override
               public void failed(Call call, IOException e) {
                   Log.i("tag", "failed");
                   runOnUiThread(new Runnable() {
                       @Override
                       public void run() {
                           loginProgress.setVisibility(View.GONE);
                           Toast.makeText(LoginActivity.this, "请求失败!", Toast.LENGTH_SHORT).show();
                       }
                   });
               }
           }

   );

}

非同期POSTリクエスト

データを送信するボタンをクリックしてください

空postSelectのパブリック(){
//必ず床を作り、
IF(tvTargetBuilding.getText()。のtoString()。のisEmpty()){
Toast.makeText(getActivity()、 "床を選択してください!"、Toast.LENGTH_SHORT) .SHOW();
戻り値;
}
//パラメータ設定要求
地図<文字列、文字列> reqBody A ConcurrentSkipListMapの新しい新しい= <>();
reqBody.put( "NUM"、」1" 。);
reqBody.put( "stuid"、無料で参加します.account);
reqBody.put( "buildingNo"、selectBuilding + "");
//ネットワーク要求インスタンスツールを取得
netUtils netUtils NetUtils.getInstance =();
//データが送信
netUtils.postDataAsynToNet(Global.SELECT_ROOM、reqBody、新しいですNetUtils.MyNetCall(){
@Override
ます。public void成功(コールコール、レスポンスレスポンス)のIOException {スロー
Log.i( "タグ"、 "成功")。
文字列結果= response.body()文字列()。
Log.i(「タグ」、 "結果:" +結果)。
//解析数据
JSONObject jsonObject1 = JSON.parseObject(結果)。
(もし!jsonObject1 = NULL){
最終int型のERROR_CODE = jsonObject1.getIntValue(「ERROR_CODE」);

                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Log.i("tag", "errcode: " + error_code);
                        if (error_code == 0) {//提交成功
                            Toast.makeText(getActivity(), "选择成功!", Toast.LENGTH_SHORT).show();
                            //跳转到selectSuccessfragment
                            MainActivity.mainActivityInstance.switchFragment(getParentFragment(),SelectSuccessFragment.newInstance("", ""));
                        } else {
                            Toast.makeText(getActivity(), "选择失败!错误代码: " + error_code, Toast.LENGTH_SHORT).show();
                        }

                    }
                });

            }
        }
        @Override
        public void failed(Call call, IOException e) {
            Log.i("tag", "failed");
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getActivity(), "请求失败!", Toast.LENGTH_SHORT).show();
                }
            });
        }
    });
リリース7件のオリジナルの記事 ウォンの賞賛0 ビュー264

おすすめ

転載: blog.csdn.net/weixin_42007220/article/details/104907954