2012-09-19 64 views
5

Estas dos direcciones URL debe ser el mismo:URL con parámetros en Java

http://localhost?asdf=1&qwer=2 
http://localhost?qwer=2&asdf=1 

Pero el uso de 'equals()' de la clase URL, entiendo que son diferentes. ¿Cómo puedo compararlos?

EDIT: Algunos antecedentes sobre esta cuestión

estoy creando una prueba de selenio por alguna correlación de URL. Tengo una url antigua, URL a la que debe asignarse y la URL real. Necesito comparar la url que debe ser a la url real. La lista de URL es creada por el cliente. URL con los mismos parámetros y valores se considerarán válidas si la lista de parámetros es el mismo, y todos ellos tienen los valores correctos (orden de esos parámetros es irrelevante)

+1

Estos dos URL son diferentes para yo (y para muchos otros :)) y es por eso que el método igual en la clase URL devuelve falso para eso. Debe escribir su propio método que compare el parámetro de consulta y devuelva el resultado de acuerdo con eso. – Ankit

+3

Son en realidad lo mismo. El orden de los parámetros no debería tener ningún efecto en ninguna aplicación J2EE. – tom

Respuesta

-1

Bueno estos dos URL son de hecho diferentes

http://localhost?asdf=1&qwer=2 
http://localhost?qwer=2&asdf=1 

//////// EDITADO PARTE //////////

Prueba esto ....

- uso en openStream()ambos la url.

- Guardar tanto de ellos como 2 String objetos, o en lugar StringBuilder.

- Ahora compare los dos usando equals().

- Esto va a resolver el problema, creo que sí ....

+1

Tenga en cuenta que los parámetros son los mismos, solo un orden diferente. Creo que la pregunta es sobre eso. –

+0

@SLBarth El método 'equals()' comprueba si los objetos apuntados por la variable de referencia de objeto son iguales o diferentes, 'como ambos url son diferentes, 2 objetos diferentes se crean en el montón, por lo que obtenemos que ambos son diff. ... tan simple como eso ... ' –

+0

@KumarVivekMitra equals está anulado ... no estás comparando las direcciones de montón allí. –

1

URL/URI es igual método se ha roto. Al menos no proporciona resultados como era de esperar. Hay muchas cosas raras con eso. Que podría estar interesado para leer

Mr. Gosling – why did you make URL equals suck?!?

o tal vez

How to compare two URLs in java?

Por lo tanto, no espere que sería fácil. Puede crear su comparador personalizado para su caso particular, pero en general es posible que tenga que analizar la cadena url.

Esperanza esto ayuda

1

Así que si lo estoy haciendo bien, se desea comparar dos URL, independientemente del orden de la parte de consulta.

No parece haber un método para esto en la clase URL, por lo que tendrá que escribir el suyo. Además, URL es final, no puede anular URL.equals(Object).

Su método podría comenzar llamando al sameFile().
Si eso se evalúa como true, entonces llama al getQuery(), y lo divide en sus componentes, probablemente con String.split("\&"). A partir de ahí, evalúa si los parámetros son los mismos.
Además, no olvide verificar si el "#fragmento" es igual, si eso es importante para su aplicación.

0

Me gusta esta pregunta, así que escribí esta pequeña demostración. (Lo siento, he utilizado la clase StringUtils de las subseries)

import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.Arrays; 
import java.util.List; 

import org.apache.commons.lang.StringUtils; 

public class URLDemo 
{ 

    /** 
    * @param args 
    * @throws MalformedURLException 
    */ 
    public static void main(String[] args) 
     throws MalformedURLException 
    { 
     String url1 = "http://localhost?asdf=1&qwer=2"; 
     String url2 = "http://localhost?qwer=2&asdf=1"; 
     URL url11 = new URL(StringUtils.substringBefore(url1, "?")); 
     URL url22 = new URL(StringUtils.substringBefore(url2, "?")); 

     if (url11.equals(url22)) 
     { 
      // url are equal but still need to check the parameters 
      List<String> params1 = Arrays.asList(StringUtils.split(StringUtils.substringAfter(url1, "?"), "&")); 
      List<String> params2 = Arrays.asList(StringUtils.split(StringUtils.substringAfter(url2, "?"), "&")); 

      // need to check both ways 
      if (params1.containsAll(params2) && params2.containsAll(params1)) 
      { 
       System.out.println("URLs are the same"); 
      } 
      else 
      { 
       System.out.println("URLs are different"); 
      } 
     } 
    } 

} 
+0

Probablemente tenga que hacer algo como esto. Realmente me cuesta creer que no haya una biblioteca probada con tal comparación. Siempre me preocupa cómo dicho código manejaría la codificación, las barras diagonales ("localhost /" vs. "localhost") y cosas por el estilo. Generalmente odio reinventar las ruedas ... – zorglub76

0

no creo que va a gustar, pero que podría ser algo así como

URL url = new URL("http://localhost?asdf=1&qwer=2"); 
URL url2 = new URL("http://localhost?qwer=2&asdf=1"); 

System.out.println(isEqual(url, url2)); 

public static boolean isEqual(URL url1, URL url2) { 

    boolean isEqual = url1.getAuthority().equals(url2.getAuthority()) && 
        url1.getPort() == url2.getPort() && 
        url1.getHost().equals(url2.getHost()) && 
        url1.getProtocol().equals(url2.getProtocol()); 

    if (isEqual) { 

     String query1 = url1.getQuery(); 
     String query2 = url2.getQuery(); 

     if (query1 != null && query2 != null) { 

      if (query1.length() == query2.length()) { 

       List<String> list1 = getParameters(query1); 
       List<String> list2 = getParameters(query2); 

       for (int index = 0; index < list1.size(); index++) { 

        String value1 = list1.get(index); 
        String value2 = list2.get(index); 
        if (!value1.equals(value2)) { 

         isEqual = false; 
         break; 

        } 

       } 

      } else { 

       isEqual = false; 

      } 

     } else { 

      isEqual = false; 

     } 

    } 

    return isEqual; 

} 

protected static List<String> getParameters(String value) { 

    List<String> parameters = new ArrayList<String>(25); 

    String[] values = value.split("&"); 
    for (String par : values) { 

     if (!par.contains("=")) { 
      par += "=null"; 
     } 

     parameters.add(par); 

    } 

    Collections.sort(parameters); 

    return parameters; 

}