Java 如何从查询字符串中删除查询参数
我正在使用从URI中删除参数:Java 如何从查询字符串中删除查询参数,java,Java,我正在使用从URI中删除参数: public static URI removeParameterFromURI(URI uri, String param) { UriBuilder uriBuilder = UriBuilder.fromUri(uri); return uriBuilder.replaceQueryParam(param, "").build(); } public static String removeParameterFromURIString(St
public static URI removeParameterFromURI(URI uri, String param) {
UriBuilder uriBuilder = UriBuilder.fromUri(uri);
return uriBuilder.replaceQueryParam(param, "").build();
}
public static String removeParameterFromURIString(String uriString, String param) {
try {
URI uri = removeParameterFromURI(new URI(uriString), param);
return uri.toString();
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
上述类型的工程和修改:
…分为:
但它有以下问题:
是否有一些标准或常用的库可以轻松地实现上述功能,而无需自己解析和破解查询字符串?我不确定是否有一些库可以提供帮助,但我只想在“?”上拆分字符串,然后在“&”上拆分后半部分。然后我将相应地重建字符串
public static void main(String[] args) {
// TODO code application logic here
System.out.println("original: http://a.b.c/d/e/f?foo=1&bar=2&zar=3");
System.out.println("new : " + fixString("http://a.b.c/d/e/f?foo=1&bar=2&zar=3"));
}
static String fixString(String original)
{
String[] processing = original.split("\\?");
String[] processing2ndHalf = processing[1].split("&");
return processing[0] + "?" + processing2ndHalf[1] + "&" + processing2ndHalf[0] + "&" + processing2ndHalf[2];
}
输出:
要删除一个参数,只需将其从返回字符串中删除即可。根据的建议,这就是我最后要做的事情(我添加了一些额外的逻辑,以便能够断言我是否希望参数存在,如果存在,会出现多少次):
publicstaticuriremoveparameterfromuri(uriuri-URI,字符串参数,boolean-assertableastonesfound,Integer-asserthowmanyreeexpected){
Assert.assertFalse(“期望0或更少是没有意义的”,(assertHowManyAreExpected!=null)&(assertHowManyAreExpected 0?URLDecoder.decode(pair.substring(0,idx),StandardCharsets.UTF_8.name()):pair;
如果(!query_pairs.containsKey(键)){
query_pairs.put(key,new ArrayList());
}
最终字符串值=idx>0&&pair.length()>idx+1?URLDecode.decode(pair.substring(idx+1),StandardCharsets.UTF_8.name()):null;
查询对。获取(键)。添加(值);
}
返回查询对;
}捕获(不支持的编码异常e){
抛出新的运行时异常(e);
}
}
如果可以,使用会更干净
public String removeQueryParameter(String url, String parameterName) throws URISyntaxException {
URIBuilder uriBuilder = new URIBuilder(url);
List<NameValuePair> queryParameters = uriBuilder.getQueryParams();
for (Iterator<NameValuePair> queryParameterItr = queryParameters.iterator(); queryParameterItr.hasNext();) {
NameValuePair queryParameter = queryParameterItr.next();
if (queryParameter.getName().equals(parameterName)) {
queryParameterItr.remove();
}
}
uriBuilder.setParameters(queryParameters);
return uriBuilder.build().toString();
}
publicstringremoveQueryParameter(stringURL,stringparameterName)抛出URISyntaxException{
URIBuilder URIBuilder=新的URIBuilder(url);
列出queryParameters=uriBuilder.getQueryParams();
for(迭代器queryparametertr=queryParameters.Iterator();queryparametertr.hasNext();){
NameValuePair queryParameter=QueryParameterTR.next();
if(queryParameter.getName().equals(parameterName)){
queryParameterTR.remove();
}
}
uriBuilder.setParameters(查询参数);
返回uriBuilder.build().toString();
}
使用流,它看起来是这样的
public String removeQueryParameter(String url, String parameterName) throws URISyntaxException {
URIBuilder uriBuilder = new URIBuilder(url);
List<NameValuePair> queryParameters = uriBuilder.getQueryParams()
.stream()
.filter(p -> !p.getName().equals(parameterName))
.collect(Collectors.toList());
if (queryParameters.isEmpty()) {
uriBuilder.removeQuery();
} else {
uriBuilder.setParameters(queryParameters);
}
return uriBuilder.build().toString();
}
publicstringremoveQueryParameter(stringURL,stringparameterName)抛出URISyntaxException{
URIBuilder URIBuilder=新的URIBuilder(url);
列出queryParameters=uriBuilder.getQueryParams()
.stream()
.filter(p->!p.getName().equals(parameterName))
.collect(Collectors.toList());
if(queryParameters.isEmpty()){
uriBuilder.removeQuery();
}否则{
uriBuilder.setParameters(查询参数);
}
返回uriBuilder.build().toString();
}
要完全删除该参数,可以使用
public static URI removeParameterFromURI(URI uri, String param) {
UriBuilder uriBuilder = UriBuilder.fromUri(uri);
return uriBuilder.replaceQueryParam(param, (Object[]) null).build();
}
您可以使用基于@Flips解决方案的集合中更简单的方法:
public String removeQueryParameter(String url, String parameterName) throws URISyntaxException {
URIBuilder uriBuilder = new URIBuilder(url);
List<NameValuePair> queryParameters = uriBuilder.getQueryParams();
queryParameters.removeIf(param ->
param.getName().equals(parameterName));
uriBuilder.setParameters(queryParameters);
return uriBuilder.build().toString();
}
publicstringremoveQueryParameter(stringURL,stringparameterName)抛出URISyntaxException{
URIBuilder URIBuilder=新的URIBuilder(url);
列出queryParameters=uriBuilder.getQueryParams();
queryParameters.removeIf(参数->
param.getName().equals(parameterName));
uriBuilder.setParameters(查询参数);
返回uriBuilder.build().toString();
}
在Android中,无需导入任何库。
我编写了一个util方法,其灵感来源于以下答案:Android中Uri.Builder中的替换查询参数?()
希望能对您有所帮助。代码如下:
public static Uri removeUriParameter(Uri uri, String key) {
final Set<String> params = uri.getQueryParameterNames();
final Uri.Builder newUri = uri.buildUpon().clearQuery();
for (String param : params) {
if (!param.equals(key)) {
newUri.appendQueryParameter(param, uri.getQueryParameter(param));
}
}
return newUri.build();
}
公共静态Uri RemoveUri参数(Uri,字符串键){
最终设置params=uri.getQueryParameterNames();
final Uri.Builder newUri=Uri.buildOn().clearQuery();
for(字符串参数:params){
如果(!参数等于(键)){
appendQueryParameter(param,uri.getQueryParameter(param));
}
}
返回newUri.build();
}
如果您在安卓系统上,希望删除所有查询参数,可以使用
uriuriwithoutquery=Uri.parse(urlWithQuery.buildOn().clearQuery().build();
公共静态字符串removeQueryParameter(字符串url,列表removeNames){
试一试{
Map queryMap=newhashmap();
Uri=Uri.parse(url);
设置queryParameterNames=uri.getQueryParameterNames();
for(字符串queryParameterName:queryParameterNames){
if(TextUtils.isEmpty(queryParameterName)
||TextUtils.isEmpty(uri.getQueryParameter(queryParameterName))
||removeNames.contains(queryParameterName)){
继续;
}
queryMap.put(queryParameterName,uri.getQueryParameter(queryParameterName));
}
//删除所有参数
Uri.Builder-uriBuilder=Uri.buildOn().clearQuery();
for(字符串名称:queryMap.keySet()){
uriBuilder.appendQueryParameter(名称,queryMap.get(名称));
}
返回uriBuilder.build().toString();
}捕获(例外e){
返回url;
}
}
对我来说很有效,但我也需要从片段中删除查询参数。因此,对片段进行了扩展,并提出了这个方法
fun Uri.removeQueryParam(key: String): Uri {
//Create new Uri builder with no query params.
val builder = buildUpon().clearQuery()
//Add all query params excluding the key we don't want back to the new Uri.
queryParameterNames.filter { it != key }
.onEach { builder.appendQueryParameter(it, getQueryParameter(it)) }
//If query param is in fragment, remove from it.
val fragmentUri = fragment?.toUri()
if (fragmentUri != null) {
builder.encodedFragment(fragmentUri.removeQueryParam(key).toString())
}
//Now this Uri doesn't have the query param for [key]
return builder.build()
}
以下代码对我很有用: 代码: 输出
http://testdomainxyz.com?username=john&password=cena&password1=cena
http://testdomainxyz.com?username=john&password1=cena
UriBuilder
没有删除查询参数的方法,您只能添加或替换。我不确定是否有库可以提供帮助,但我只想在“?”上拆分字符串,然后在“&”上拆分后一半。然后我会相应地重建字符串。是否支持将秒字符串设置为bar=2?或者您可以使用生成器从头开始重建第二个URL,添加所有
fun Uri.removeQueryParam(key: String): Uri {
//Create new Uri builder with no query params.
val builder = buildUpon().clearQuery()
//Add all query params excluding the key we don't want back to the new Uri.
queryParameterNames.filter { it != key }
.onEach { builder.appendQueryParameter(it, getQueryParameter(it)) }
//If query param is in fragment, remove from it.
val fragmentUri = fragment?.toUri()
if (fragmentUri != null) {
builder.encodedFragment(fragmentUri.removeQueryParam(key).toString())
}
//Now this Uri doesn't have the query param for [key]
return builder.build()
}
import java.util.Arrays;
import java.util.stream.Collectors;
public class RemoveURL {
public static void main(String[] args) {
final String remove = "password";
final String url = "http://testdomainxyz.com?username=john&password=cena&password1=cena";
System.out.println(url);
System.out.println(RemoveURL.removeParameterFromURL(url, remove));
}
public static String removeParameterFromURL(final String url, final String remove) {
final String[] urlArr = url.split("\\?");
final String params = Arrays.asList(urlArr[1].split("&")).stream()
.filter(item -> !item.split("=")[0].equalsIgnoreCase(remove)).collect(Collectors.joining("&"));
return String.join("?", urlArr[0], params);
}
}
http://testdomainxyz.com?username=john&password=cena&password1=cena
http://testdomainxyz.com?username=john&password1=cena