HttpURLConnection
package com.example.administrator.words.http;
import android.os.AsyncTask;
import android.text.TextUtils;
import android.util.Log;
import com.example.administrator.words.util.ToastUtil;
import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.lang.ref.WeakReference;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by ldp.
* <p>
* Date: 2021-01-30
* <p>
* Summary: 安卓原生异步网络请求封装 单例设计模式 异步任务实现 异步请求
*/
public class HttpHelper {
private HttpHelper() {
}
public static HttpHelper getInstance() {
return Instance.INSTANCE;
}
private static final class Instance {
private static final HttpHelper INSTANCE = new HttpHelper();
}
/**
* 异步请求
*/
private static class HttpTask extends AsyncTask<Object, Integer, Object> {
private final WeakReference<HttpCallback> callback;
private HttpRequestParams requestParams;
public HttpTask(HttpCallback callback) {
this.callback = new WeakReference<>(callback);
}
@Override
protected Object doInBackground(Object... objects) {
if (objects.length > 0) {
this.requestParams = (HttpRequestParams) objects[0];
HttpURLConnection connection = null;
StringBuilder result = new StringBuilder("");
try {
if (requestParams.getRequestMethod() == HttpRequestMethod.GET) {
// get请求
// 拼接参数 因为 get请求 参数要拼接在 后面 所以要先拼接
if (requestParams.getParamsMap().size() > 0) {
String requestUrl = requestParams.getRequestUrl();
StringBuilder builder = new StringBuilder(requestUrl);
builder.append("?");
for (Map.Entry<String, String> item : requestParams.getParamsMap().entrySet()) {
if (!builder.toString().endsWith("?")) {
builder.append("&");
}
builder.append(item.getKey()).append("=")
.append(isContainChinese(item.getValue())
? URLEncoder.encode(item.getValue(), "UTF-8")
: item.getValue());
}
requestParams.setRequestUrl(builder.toString());
}
URL url = new URL(requestParams.getRequestUrl());
Log.e("httpUrl",requestParams.getRequestUrl());
connection = (HttpURLConnection) url.openConnection();
if (!TextUtils.isEmpty(requestParams.getContentType())){
connection.addRequestProperty("Content-Type",requestParams.getContentType());
}
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
connection.setRequestMethod(HttpRequestMethod.GET.name());
} else if (requestParams.getRequestMethod() == HttpRequestMethod.POST) {
// post 请求
URL url = new URL(requestParams.getRequestUrl());
Log.e("httpUrl",requestParams.getRequestUrl());
connection = (HttpURLConnection) url.openConnection();
if (!TextUtils.isEmpty(requestParams.getContentType())){
// header 设置 Content-Type 有别的需求可以加在这里
connection.addRequestProperty("Content-Type",requestParams.getContentType());
}
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
connection.setRequestMethod(HttpRequestMethod.POST.name());
// post 请求要设置
connection.setDoInput(true);
connection.setDoOutput(true);
//Post方式不能缓存,需手动设置为false
connection.setUseCaches(false);
// 设置请求参数
if (requestParams.getParamsMap().size() > 0) {
StringBuilder builder = new StringBuilder("");
for (Map.Entry<String, String> item : requestParams.getParamsMap().entrySet()) {
if (!TextUtils.isEmpty(builder)) {
builder.append("&");
}
builder.append(item.getKey()).append("=")
.append(isContainChinese(item.getValue())
? URLEncoder.encode(item.getValue(), "UTF-8")
: item.getValue());
}
OutputStream connectionOutputStream = connection.getOutputStream();
connectionOutputStream.write(builder.toString().getBytes());
connectionOutputStream.flush();
}
}else {
}
// 请求 结果
if (connection.getResponseCode() == 200) {
InputStream inputStream = connection.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
result.append(line);
}
Log.e("httpUrl",result.toString());
inputStream.close();
inputStreamReader.close();
bufferedReader.close();
} else {
callback.get().onError("网络请求失败 " + connection.getResponseCode() + " " + connection.getResponseMessage(), requestParams.getRequestTag());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
}
return result.toString();
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
String result = String.valueOf(o);
dealWithResponseInfo(result);
}
/**
* 匹配请求参数 是否有中文 进行 edcode 否则低版本 安卓报错
*/
public boolean isContainChinese(String str) {
try {
Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
Matcher m = p.matcher(str);
if (m.find()) {
return true;
}
return false;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 处理 gson 解析数据
*/
private void dealWithResponseInfo(String response) {
if (callback.get() == null) {
ToastUtil.showMsg("callback is null");
return;
}
if (TextUtils.isEmpty(response)) {
callback.get().onError("空数据~",requestParams.getRequestTag());
return;
}
if (requestParams.getParseClass() == null) {
callback.get().onSuccess(response,requestParams.getRequestTag());
} else {
Object gsonData = new Gson().fromJson(response, requestParams.getParseClass());
callback.get().onSuccess(gsonData,requestParams.getRequestTag());
}
}
}
/**
* 网络请求
* @param requestParams 请求参数
* @param callback 回调
*/
public void startRequest(HttpRequestParams requestParams, HttpCallback callback) {
// 异步请求
new HttpTask(callback).execute(requestParams);
}
}
package com.example.administrator.words.http;
/**
* Created by ldp.
* <p>
* Date: 2021-01-30
* <p>
*/
public enum HttpRequestMethod {
// get 方法
GET,
// post 方法
POST
// 其他方法
}
package com.example.administrator.words.http;
/**
* Created by ldp.
* <p>
* Date: 2021-01-30
* <p>
*/
public interface HttpCallback {
/**
* 请求成功 回调
* @param gsonData 返回数据 如果指定了 实体类 将被 gson 解析为指定类型
* @param requestTag 多个请求时 可以做区分请求 请求标记
*/
void onSuccess(Object gsonData, Object requestTag);
/**
* 请求失败 回调
* @param errorMsg 错误消息
* @param requestTag 请求标记
*/
void onError(String errorMsg, Object requestTag);
}
package com.example.administrator.words.http;
import java.util.HashMap;
/**
* Created by ldp.
* <p>
* Date: 2021-01-30
* <p>
* Summary:
* <p>
* api path:
*/
public class HttpRequestParams {
// 默认 get 方式 请求数据
private HttpRequestMethod requestMethod = HttpRequestMethod.GET;
// 请求 参数 map
private HashMap<String, String> paramsMap = new HashMap<>();
// header contentType
private String contentType;
// 设置 json 解析的实体类
private Class<?> parseClass;
// 请求链接
private String requestUrl;
// 请求 标记
private Object requestTag;
public HttpRequestParams(){
paramsMap.clear();
}
@Deprecated
public HttpRequestParams(String requestUrl) {
this(requestUrl, null);
}
/**
* 常规 get 请求
*/
public HttpRequestParams(String requestUrl, Class<?> parseClass) {
this(requestUrl, HttpRequestMethod.GET, parseClass);
}
/**
* 指定 get或者post请求
*
*/
public HttpRequestParams(String requestUrl, HttpRequestMethod requestMethod, Class<?> parseClass) {
this.requestUrl = requestUrl;
this.requestMethod = requestMethod;
this.parseClass = parseClass;
this.paramsMap.clear();
}
public void put(String key, Object value) {
paramsMap.put(key, String.valueOf(value));
}
public HashMap<String, String> getParamsMap() {
return paramsMap;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public Class<?> getParseClass() {
return parseClass;
}
public HttpRequestMethod getRequestMethod() {
return requestMethod;
}
public void setRequestMethod(HttpRequestMethod requestMethod) {
this.requestMethod = requestMethod;
}
public void setParamsMap(HashMap<String, String> paramsMap) {
this.paramsMap = paramsMap;
}
public void setParseClass(Class<?> parseClass) {
this.parseClass = parseClass;
}
public String getRequestUrl() {
return requestUrl;
}
public void setRequestUrl(String requestUrl) {
this.requestUrl = requestUrl;
}
public Object getRequestTag() {
return requestTag;
}
public void setRequestTag(Object requestTag) {
this.requestTag = requestTag;
}
}
举个例子 ,代码为 kotlin
private fun requestApiTranslateContent() {
if (TextUtils.isEmpty(content_tv?.text?.toString())) {
ToastUtil.showMsg("翻译内容不能为空~")
return
}
val num = (Math.random() * 10000).toInt()
val str = content_tv?.text?.toString()
var httpRequestParams: HttpRequestParams = HttpRequestParams()
// get请求 httpRequestParams = HttpRequestParams(Constants.BAI_DUI_TRANSLATE_API_URL, HttpRequestMethod.GET, TranslateBean::class.java)
// post 请求
httpRequestParams = HttpRequestParams(Constants.BAI_DUI_TRANSLATE_API_URL, HttpRequestMethod.POST, TranslateBean::class.java)
httpRequestParams.contentType = "application/x-www-form-urlencoded"
httpRequestParams.put("q", str)
httpRequestParams.put("from", "auto")//翻译的内容 语言属于 哪一种 auto 自动监测
httpRequestParams.put("to", translationType)
httpRequestParams.put("appid", "xxxxxx")
httpRequestParams.put("salt", num)
httpRequestParams.put("sign", MD5.md5("xxxxxx"))
showCustomLoadingDialog()
HttpHelper.getInstance().startRequest(httpRequestParams, object : HttpCallback {
override fun onSuccess(gsonData: Any, requestTag: Any) {
dismissCustomLoadingDialog()
if (gsonData is TranslateBean) {
val transResult = gsonData.trans_result
val result = StringBuilder()
if (transResult.isNullOrEmpty()) {
ToastUtil.showMsg("翻译出错,结果为空")
return
}
for (itemText in transResult) {
result.append(itemText.dst).append("\n")
}
result_txt_tv?.text = result.toString()
}
}
override fun onError(errorMsg: String, requestTag: Any) {
dismissCustomLoadingDialog()
ToastUtil.showMsg(errorMsg)
}
})
}