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>
- 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];
}
}
}
- 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();
}
});
}
});