Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从查询字符串中删除查询参数_Java - Fatal编程技术网

Java 如何从查询字符串中删除查询参数

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

我正在使用从URI中删除参数:

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