Uso OKHttp3 conseguir solicitud, enviar una solicitud para subir archivos

1 primera necesidad de crear un OKHttpClient

Puede dirigir un nuevo

OkHttpClient cliente = new OkHttpClient ()
es más de un constructor para construir un (ese método addInterceptor es agregar interceptores, no puede escribir, Baidu específicos, Bing, Sogou)

buildHttpClient private void () {
this.client = new OkHttpClient.Builder ()
.addInterceptor (nuevo interceptor () {
intercepción de respuesta pública (cadena de la cadena) throws IOException {
solicitud Solicitud = chain.request ();
respuesta Respuesta = chain.proceed ( solicitud);
respuesta de retorno;
}
})
.connectTimeout (4000, TimeUnit.MILLISECONDS)
.readTimeout (4000, TimeUnit.MILLISECONDS)
.writeTimeout (4000, TimeUnit.MILLISECONDS)
.build ();
}
2 GET请求

get private void () {
/ *如果需要参数,在url后边拼接:? a = b = aaa y bbb ... * /
. = solicitud Solicitud nueva Request.Builder () url ( “http://192.168.10.117:8080/test ").construir();
client.newCall (petición) .enqueue (nueva devolución de llamada () {
public void onResponse (llamada Registro de llamadas, respuesta respuesta final) throws IOException {
resultado final String = response.body () cadena ();.
bien booleano final = response.isSuccessful ( );
runOnUiThread (nueva Ejecutable () {
public void run () {
Toast.makeText (OKHttpActivity.this, resultado, Toast.LENGTH_SHORT) .show ();
}
});
}
onFailure public void (llamada Registro de llamadas, IOException e) {
runOnUiThread (nueva Ejecutable () {
public void run () {
Toast.makeText (OKHttpActivity.this, “error”, Toast.LENGTH_SHORT) .show ();
}
});
}
});
}
3 de POST请求

puesto private void () {
FormBody.Builder constructor = new FormBody.Builder ();
/ *添加两个参数* /
builder.add ( “p”, “我勒个去”) .Add ( “a”, “Hola”);
Cuerpo FormBody = builder.build ();
Solicitud Solicitud = new Request.Builder () url ( “http://192.168.10.117:8080/test”) .post (cuerpo) .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 Multi-carga de archivos

upFile vacío privado () {
/ *第一个要上传的archivo * /
archivo1 archivo = new File (Environment.getExternalStorageDirectory () getAbsolutePath () + “/a.jpg”.);
RequestBody fileBody1 = RequestBody.create (MediaType.parse ( “application / octet-stream”), archivo1);
Cadena 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();  
            }  
        });  
    }  
});  

}
Paquete sencillo de dos

Embalaje herramientas okhttp3 sencilla para facilitar su uso posterior utilizado directamente.

okhttp versión es:

la compilación 'com.squareup.okhttp3: okhttp: 3.8.1'
. 1
de la herramienta o similares funciones como sigue:

Obtener solicitud, el modo de acceso síncrono de datos de la red
demanda Publicar, una adquisición de datos síncrona
Get solicitud, obtener datos de la red de forma asíncrona
demanda Publicar para obtener datos de forma asíncrona
apoyar solicitudes HTTPS, saltar automáticamente la verificación del certificado
determina si una red disponible actual
en el que la solicitud presentada por el Post pares de valores clave <String, String>

  1. El código completo

android.content.Context importación;
android.net.ConnectivityManager importación;
android.net.NetworkInfo importación;
android.util.Log importación;

java.io.IOException importación;
java.security.SecureRandom importación;
java.security.cert.CertificateException importación;
java.security.cert.X509Certificate importación;
java.util.Iterator importación;
java.util.Map importación;
java.util.concurrent.TimeUnit importación;

javax.net.ssl.HostnameVerifier importación;
javax.net.ssl.SSLContext importación;
javax.net.ssl.SSLSession importación;
javax.net.ssl.SSLSocketFactory importación;
javax.net.ssl.TrustManager importación;
javax.net.ssl.X509TrustManager importación;

okhttp3.Call importación;
okhttp3.Callback importación;
okhttp3.OkHttpClient importación;
okhttp3.Request importación;
okhttp3.RequestBody importación;
okhttp3.Response importación;

/ **

  • Creado por fxjzzyo el 12/07/2017.
    * /

NetUtils clase pública {
byte de private static final [] LOCAL = new byte [0];
estática privada NetUtils mInstance;
mOkHttpClient OkHttpClient privado;

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. ejemplo de uso

Se recomienda el uso de peticiones asíncronas, como lo ha sido la solicitud de red pone automáticamente el hilo hijo, y con él un poco más fácil. La solicitud de sincronización también necesita su propio manejador de nuevo hilo de rosca + a hacer, y casi no hay diferencia entre la solicitud original a la red. Por lo tanto este ejemplo se puede citar más que la solicitud asíncrona.

solicitud GET asíncrono

Haga clic en el botón Iniciar sesión

Login public void (Vista) {
toString cuenta final String = etAccount.getText () () ;.
final pass = etPassword.getText String () toString () ;.
SI (account.isEmpty () || pass.isEmpty () ) {
Toast.makeText (el presente "un nombre de usuario o contraseña no está en blanco!", Toast.LENGTH_SHORT) la .Show ();
return;
}
SI (Global.isNetAvailable)!
{
Toast.makeText (el presente, "la red no está disponible! ", Toast.LENGTH_SHORT) la .Show ();
return;
}
// barra de progreso
loginProgress.setVisibility (View.VISIBLE);
// obtener instancia de clase herramientas de red
netUtils netUtils NetUtils.getInstance = ();
// solicitar a la red, un Código get
netUtils.getDataAsynFromNet (Global.LOGIN + "? nombre de usuario =" + la cuenta + "& password =" + Pass,
nueva nueva NetUtils.MyNetCall () {
@ Override
pública éxito vacío (llamada Registro de llamadas, respuesta Respuesta) throws IOException {
( “etiqueta”, “éxito”) Log.i;
Resultado String = response.body () cadena ().;
última ResponseBean responseBean = JSON.parseObject (resultado, 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();
                       }
                   });
               }
           }

   );

}

solicitud asincrónica de POST

Haga clic en el botón para enviar los datos

public void postSelect () {
// Asegúrese de que el piso,
SI (tvTargetBuilding.getText (). toString (). estaVacia ()) {
Toast.makeText (getActivity (), "Por favor, seleccione el suelo!", Toast.LENGTH_SHORT) la .Show ();
return;
}
// parámetro de configuración solicitar
el Mapa <String, String> reqBody un ConcurrentSkipListMap nuevos nuevos = <> ();
reqBody.put ( "NUM"," 1" .);
reqBody.put ( "stuid", Ingreso libre .account);
reqBody.put ( "buildingNo", selectBuilding + "");
// obtener herramientas de solicitud de instancias de red
netUtils netUtils NetUtils.getInstance = ();
// datos presentados
netUtils.postDataAsynToNet (Global.SELECT_ROOM, reqBody, nuevo NetUtils.MyNetCall () {
@Override
public void éxito (Llamar al, la Respuesta Respuesta) throws IOException {
Log.i ( "etiqueta", "éxito");
Resultado String = response.body () cadena ().;
Log.i ( “etiqueta”, "número:" + resultado);
//解析数据
JSONObject jsonObject1 = JSON.parseObject (resultado);
si (jsonObject1! = null) {
int última código_error = jsonObject1.getIntValue ( “código_error”);

                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();
                }
            });
        }
    });
Publicado siete artículos originales · ganado elogios 0 · Vistas 264

Supongo que te gusta

Origin blog.csdn.net/weixin_42007220/article/details/104907954
Recomendado
Clasificación