Java'da bir URL veya URI oluşturmanın deyimsel yolu nedir?


115

Java'da nasıl URL veya URI oluşturabilirim? Bunu kolayca yapan deyimsel bir yol veya kütüphaneler var mı?

Bir istek dizesinden başlatmaya, çeşitli URL parçalarını (şema, ana bilgisayar, yol, sorgu dizesi) ayrıştırmaya / değiştirmeye ve sorgu parametrelerinin eklenmesini ve otomatik olarak kodlanmasını desteklemem gerekiyor.


7
Sorunun kapatıldıktan uzun bir süre sonra tekrar oylanması, çünkü bu soruna popüler, kullanımdan kaldırılmamış bir çözümün mevcut olup olmadığı net değildir. Bunu, 'java URL parametre sınıfı' için googling yaparak buldum.
user1445967

4
Niyetim Java için bir URL oluşturucu bulmaktı ve bu soru en azından benim için yararlı.
whirlwin

Yanıtlar:


76

Apache HTTP Bileşeni HttpClient 4.1.3 itibariyle, resmi öğreticiden :

public class HttpClientTest {
public static void main(String[] args) throws URISyntaxException {
    List<NameValuePair> qparams = new ArrayList<NameValuePair>();
    qparams.add(new BasicNameValuePair("q", "httpclient"));
    qparams.add(new BasicNameValuePair("btnG", "Google Search"));
    qparams.add(new BasicNameValuePair("aq", "f"));
    qparams.add(new BasicNameValuePair("oq", null));
    URI uri = URIUtils.createURI("http", "www.google.com", -1, "/search",
                                 URLEncodedUtils.format(qparams, "UTF-8"), null);
    HttpGet httpget = new HttpGet(uri);
    System.out.println(httpget.getURI());
    //http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq=
}
}

Düzenleme: v4.2'den URIUtils.createURI()itibaren aşağıdakiler lehine kullanımdan kaldırılmıştır URIBuilder:

URI uri = new URIBuilder()
        .setScheme("http")
        .setHost("www.google.com")
        .setPath("/search")
        .setParameter("q", "httpclient")
        .setParameter("btnG", "Google Search")
        .setParameter("aq", "f")
        .setParameter("oq", "")
        .build();
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());

20
Bu çalışır, ancak v4.2'den itibaren URIUtils.createURI (), URIBuilder lehine kullanımdan kaldırılmıştır. Olumlu tarafta, bu URIBuilder bir addParameter () yöntemine sahip gibi görünüyor, bu nedenle istek dizelerini oluşturmak en azından şimdi daha basit olmalı.
stian

6
URIBuilder builder = new URIBuilder() .setScheme("http") .setHost("www.google.com") .setParameters(qparams);@stian'ın dediği gibi
vanduc1102

Yukarıdaki Println aşağıdakileri yazdırır; google.com/…
Berkan Ercan

61

Yazar olarak, URL / URI oluşturucumun iyi olup olmadığına muhtemelen karar verebilecek en iyi kişi ben değilim , ancak yine de burada: https://github.com/mikaelhg/urlbuilder

JDK dışında sıfır bağımlılıkla mümkün olan en basit eksiksiz çözümü istedim, bu yüzden kendi çözümümü almak zorunda kaldım.


6
Harika görünüyor Mikael, onu Maven Central'da yayınlamayı düşündün mü? Küçük olduğunu biliyorum ama kullanımı kolaylaştırıyor. JAX-RS dışında benzer bir sınıf bulamıyorum. Bağımlılıkların olmaması kesinlikle bir artı.
Barry Pitman

Güzel görünüyor, ancak bir oluşturucu ve dolayısıyla değiştirilebilir olduğundan, neden yalnızca parametreler için ayarlayıcılar var, ancak ana bilgisayar, bağlantı noktası, protokol ve yol için değil? Ve onlar için de alıcı yok. UPD: Oh, değiştirilebilir değil - setParameter bir klon oluşturur. Yine de setHost / setPort / ... aynı şekilde çalışabilir. Ya da belki değişken bir versiyona sahip olmak güzel olurdu.
mvmn

3
"sıfır bağımlılıkla mümkün olan en basit eksiksiz çözüm" - Neyin önemli olduğunu biliyormuşsunuz gibi geliyor! Cevabınız kabul edilen bir imho olmalıdır. Tüm HttpClient dahil (tüm sürüm güncellemeleri ve hatta bu sorunun çok API'sini kullanımdan kaldırılmasıyla birlikte), yalnızca bir url oluşturmak için, hatalarla dolu en yoğun uygulamaları yapan şeydir.
Stijn de Witt

2
Nihayet Maven Central'da ve bitirmem sadece dört yılımı aldı.
Mikael Gueck

@mikaelhg Teşekkürler! Tam olarak bu anda ihtiyacım var!
Fabian Damken


29

HTTPClient kullanmak iyi çalıştı.

protected static String createUrl(List<NameValuePair> pairs) throws URIException{

  HttpMethod method = new GetMethod("http://example.org");
  method.setQueryString(pairs.toArray(new NameValuePair[]{}));

  return method.getURI().getEscapedURI();

}

6
Bu artık kullanımdan kaldırılmış bir işlevdir. Beni şaşırttığı için aynı şeyi yapmak için yeni HTTP Bileşenleri paketini nasıl kullanacağını bilen var mı?
Link19

3
Yeni 4x versiyonu artık bunu desteklemiyor.
Joscha

13

URI oluşturma konusunda size yardımcı olabilecek birçok kitaplık vardır (tekerleği yeniden keşfetmeyin). İşte başlamanız için üç tane:


Java EE 7

import javax.ws.rs.core.UriBuilder;
...
return UriBuilder.fromUri(url).queryParam(key, value).build();

org.apache.httpcomponents: httpclient: 4.5.2

import org.apache.http.client.utils.URIBuilder;
...
return new URIBuilder(url).addParameter(key, value).build();

org.springframework: bahar-web: 4.2.5.RELEASE

import org.springframework.web.util.UriComponentsBuilder;
...
return UriComponentsBuilder.fromUriString(url).queryParam(key, value).build().toUri();

Ayrıca bkz .: GIST> URI Oluşturucu Testleri


2
EE 7 doğru cevaptır. Tek yapmanız gereken, tüm EE kitaplıkları paketini çekmek, bir JAX-RS uygulaması seçmek, jax-rs sürüm çakışmalarını çözmek ve ödül olarak gerçekten iyi çalışan kullanışlı bir UriBuilder sınıfına sahip olmaktır. Alay kenara, bu ise doğru cevap. :)
tekHedd


10

OkHttp kullanın

Bu var 2020 ve adlandırılmış çok popüler bir kütüphane bulunmaktadır OkHttp yıldız eklendi 35K GitHub'dan kez. Bu kütüphane ile aşağıdaki gibi bir url oluşturabilirsiniz:

import okhttp3.HttpUrl;

URL url = new HttpUrl.Builder()
    .scheme("http")
    .host("example.com")
    .port(4567)
    .addPathSegment("foldername/1234")
    .addQueryParameter("abc", "xyz")
    .build().url();

Bir yazım hatasını düzelttim, bu addPathSegment(değil addPathSegments).
PapaFreud

1

URL sınıfını önerdiği için eleştirildikten sonra. Yorumcunun tavsiyesine uyacağım ve bunun yerine URI sınıfını önereceğim . Sınıf oluşturulduktan sonra çok değişmez olduğu için bir URI için kuruculara yakından bakmanızı öneririm.
Bu kurucunun URI'de ihtiyaç duyabileceğiniz her şeyi ayarlamanıza izin verdiğini düşünüyorum.

URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment)
          Constructs a hierarchical URI from the given components.

8
Ancak, bir dizi ad-değer çiftinden bir sorgu dizesini gerçekten oluşturmak ve kodlamak için işlevsellik sağlamaz.
Link19

4
Harika çocuğun Alan Partridge'e söylediği gibi - kişi değişmezliğin bozulması olamaz, ya öyle ya da değil ;-) youtube.com/watch?v=_lvFns5Lubc
Stewart

URI'nin kurucusu yola kötü şeyler yapıyor. Ayrıntılar için blog.palominolabs.com/2013/10/03/… bakın.
mpierce

1
O halde bu cevabın bunu nasıl YAPMAYACAĞINIZIN bir örneği olarak durmasına izin verin.
Mike Pone

1
Dize sorgusu ... Ayrıntı için teşekkürler Sun / Oracle. Tüm boşlukları artı sembollerle değiştireceğiz, tüm parametreleri uri-kodlayacağız ve hepsini birbirimize ve işareti ile bağlayacağız, sonra kendimiz ... tekrar tekrar masaya vuracağız
Stijn de Witt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.