Android Url的一些常见问题
发布时间:2023-10-19 10:43:47 所属栏目:语言 来源:
导读:日常开发的时候,会遇到各种各样的Url.这里就总结一些常见的Url遇到的一些问题,以及对应的处理方式
常见问题
参数问题
重定向问题
Url长度问题
Url传递过程中编码问题
1.Url 参数处理
1.1 获取Url 指定参数的值
常见问题
参数问题
重定向问题
Url长度问题
Url传递过程中编码问题
1.Url 参数处理
1.1 获取Url 指定参数的值
日常开发的时候,会遇到各种各样的Url.这里就总结一些常见的Url遇到的一些问题,以及对应的处理方式 常见问题 参数问题 重定向问题 Url长度问题 Url传递过程中编码问题 1.Url 参数处理 1.1 获取Url 指定参数的值 /** * 获取Url的原来参数值 */ fun getQueryParameterValue(url: String, key: String): String? { if (TextUtils.isEmpty(url) || TextUtils.isEmpty(key)) return url var uri = Uri.parse(url) if (uri.isOpaque()) { return url } //利用Map的唯一性拼接参数 var parameterMap = getParameterMap(url) return parameterMap.get(key) } /** * 获取Url参数的值(Decode之后的) * * getQueryParameter() 方法是默认Decode的 * */ fun getQueryParameterDecodeValue(url: String, key: String): String? { if (TextUtils.isEmpty(url) || TextUtils.isEmpty(key)) return "" var uri = Uri.parse(url) if (uri.isOpaque()) { return "" } else { return Uri.parse(url).getQueryParameter(key) } } /** * 把url 的参数转为Map存储 */ private fun getParameterMap( url: String ): HashMap<String, String> { var map: HashMap<String, String> = HashMap<String, String>() // 参数名字的列表 var parameter = Uri.parse(url).queryParameterNames parameter.forEach { if (getQueryParameterDecodeValue(url, it) != null) map.put(it, getQueryParameterDecodeValue(url, it)!!) } return map } 2.获取重定向地址的真实地址 package com.wu.base.util; import android.text.TextUtils; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.concurrent.TimeUnit; import io.reactivex.Observable; import io.reactivex.ObservableOnSubscribe; import io.reactivex.ObservableSource; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.functions.Function; import io.reactivex.schedulers.Schedulers; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; /** * @author wkq * @date 2022年07月22日 16:15 * @des 重定向Url处理工具 */ public class UrlRedirectUrlUtil { //是否Encode private static boolean isEncode = false; private static Disposable callDisposable; //获取重定向后的真实地址 public static String getRedirectUrl(String path) { boolean isEncode = false; if (TextUtils.isEmpty(path)) { return ""; } if (findEnd(path)) { return path; } if (isShortUrl(path)) return path; try { if (path.contains("#")) { path = path.replace("#", URLEncoder.encode("#")); isEncode = true; } OkHttpClient mOkHttpClient = new OkHttpClient(); Request request = new Request.Builder() .addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8") .addHeader("Accept-Encoding", "gzip, deflate, br") .addHeader("Accept-Language", "zh-CN,zh;q=0.9") .addHeader("Connection", "keep-alive") .addHeader("User-Agent", "Mozilla/5.0 (Linux; Android 5.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Mobile Safari/537.36") .url(path) .build(); Call mCall = mOkHttpClient.newCall(request); Response response = mCall.execute(); String backUrl = response.header("Location"); if (response.code() != HttpURLConnection.HTTP_MOVED_TEMP && response.code() != HttpURLConnection.HTTP_MOVED_PERM) { String requestPath = response.request().url().toString(); if (isEncode) { requestPath = requestPath.replace("%23", URLDecoder.decode("%23")); isEncode = false; } return requestPath; } else { return getRedirectUrl(backUrl); } } catch (Exception e) { e.printStackTrace(); return path; } } //处理重定向的Url public static void getRedirectUrl(String url, ResponseCallBack callBack) { if (callBack == null) return; //取消上一个请求 cancelRequest(); if (TextUtils.isEmpty(url)) { callBack.getRedirectFail(); return; } if (findEnd(url)) { callBack.getRedirectSuccess(url); return; } if (isShortUrl(url)) { callBack.getRedirectSuccess(url); return; } callDisposable = Observable .create((ObservableOnSubscribe<String>) emitter -> { if (url.contains("#")) { isEncode = true; emitter.onNext(url.replace("#", URLEncoder.encode("#"))); } else { emitter.onNext(url); } emitter.onComplete(); }) .flatMap((Function<String, ObservableSource<String>>) s -> new Observable<String>() { @Override protected void subscribeActual(Observer<? super String> observer) { Request.Builder builder = new Request.Builder(); builder.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"); builder.header("Accept-Encoding", "gzip, deflate, br"); builder.header("Accept-Language", "zh-CN,zh;q=0.9"); builder.header("Connection", "keep-alive"); builder.header("User-Agent", "Mozilla/5.0 (Linux; Android 5.0; AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Mobile Safari/537.36"); Request request = builder.url(s).get().build(); OkHttpClient client = new OkHttpClient() .newBuilder() .followRedirects(false) .connectTimeout(10, TimeUnit.SECONDS)//设置连接超时时间 .writeTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS)//设置读取超时时间 .build(); client.writeTimeoutMillis(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { observer.onError(new Throwable("解析失败")); } @Override public void onResponse(Call call, Response response) throws IOException { String path = url; if (response.code() == HttpURLConnection.HTTP_MOVED_TEMP || response.code() == HttpURLConnection.HTTP_MOVED_PERM) { String location = response.headers().get("Location"); if (!TextUtils.isEmpty(location)) { path = location; } if (isEncode) { path = path.replace("%23", URLDecoder.decode("%23")); isEncode = false; } } observer.onNext(path); observer.onComplete(); } }); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( path -> callBack.getRedirectSuccess(path), throwable -> callBack.getRedirectFail()); } // 取消请求 public static void cancelRequest() { if (callDisposable != null && !callDisposable.isDisposed()) { callDisposable.dispose(); } } /** * 判断是否是是讯云短连接 * * @param url * @return */ public static boolean isShortUrl(String url) { return false; } /** * 判断外部链接.MP4结尾 */ public static boolean findEnd(String url) { if (url.endsWith(".mp4")) { return true; } return false; } public interface ResponseCallBack { void getRedirectSuccess(String url); void getRedirectFail(); } } 3.处理地址过长问题 日常开发的时候有一些三方SDK对Url的长度做出了限制,再加上日常使用过程中Url贼长让需要对Url做操作的同事极度反感,这个时候就需要对很长的Url做处理,以下是个人对长连接做的处理 缩短器:后台来个长变短的服务,其实也就是一个字符串变短的算法,移动端请求接口即可 对Url的参数进行编码使参数变短 (编辑:马鞍山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |