जावा में URL या URI की रचना करने का मुहावरेदार तरीका क्या है?


115

मैं जावा में URL या URI कैसे बनाऊं? क्या कोई मुहावरेदार तरीका है, या पुस्तकालय जो आसानी से ऐसा करते हैं?

मुझे एक अनुरोध स्ट्रिंग, पार्स / विभिन्न URL भागों (योजना, होस्ट, पथ, क्वेरी स्ट्रिंग) से बदलने और स्वचालित रूप से क्वेरी पैरामीटर को जोड़ने और समर्थन करने की अनुमति देने की आवश्यकता है।


7
प्रश्न को लंबे समय तक बंद करने के बाद उसे बंद कर देना क्योंकि यह स्पष्ट नहीं है कि इस समस्या का एक लोकप्रिय गैर-वंचित समाधान मौजूद है या नहीं। मुझे यह 'जावा URL पैरामीटर क्लास' के लिए googling द्वारा मिला।
user1445967

4
मेरा इरादा जावा के लिए एक URL बिल्डर खोजने का था, और यह प्रश्न मेरे लिए कम से कम उपयोगी है।
भंवर

जवाबों:


76

आधिकारिक ट्यूटोरियल से Apache HTTP Component HttpClient 4.1.3 के रूप में :

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=
}
}

संपादित करें: v4.2 के रूप URIUtils.createURI()में पदावनत किया गया है 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
यह काम करता है, लेकिन v4.2 URIUtils.createURI () के रूप में URIBuilder के पक्ष में पदावनत किया गया है। सकारात्मक पक्ष पर यह URIBuilder एक addParameter () विधि है, इसलिए अनुरोध अनुरोध को कम से कम अब और सरल होना चाहिए।
स्टियन

6
URIBuilder builder = new URIBuilder() .setScheme("http") .setHost("www.google.com") .setParameters(qparams);जैसा कि @stian ने कहा
vanduc1102

Println ऊपर निम्नलिखित प्रिंट करता है; google.com/…
बेरकन एरकन

61

लेखक के रूप में, मैं शायद यह बताने के लिए सबसे अच्छा व्यक्ति नहीं हूं कि मेरा URL / URI बिल्डर अच्छा है , लेकिन फिर भी यह है: https://github.com/mikaelhg/urlbuilder

मैं जेडडीके के बाहर शून्य निर्भरता के साथ सबसे सरल संभव पूर्ण समाधान चाहता था, इसलिए मुझे अपना रोल करना था।


6
यह महान मिकेल दिखता है, क्या आपने इसे मावेन केंद्रीय को प्रकाशित करने के बारे में सोचा है? मुझे इसका छोटा पता है लेकिन इसका उपयोग करना आसान है। मुझे JAX-RS के अलावा एक समान कक्षा नहीं मिल रही है। निर्भरता की कमी निश्चित रूप से एक प्लस है।
बैरी पिटमैन

यह अच्छा लग रहा है, लेकिन चूंकि यह एक बिल्डर है और इस तरह से उत्परिवर्तनीय है, इसलिए केवल मापदंडों के लिए ही क्यों व्यवस्थित होते हैं, लेकिन होस्ट, पोर्ट, प्रोटोकॉल और पथ के लिए नहीं? और, ठीक है, उन लोगों के लिए कोई गेटर्स भी नहीं। UPD: ओह, यह म्यूट नहीं है - सेटपैरमीटर एक क्लोन बनाता है। खैर, अभी भी setHost / setPort / ... उसी तरह काम कर सकता है। या, शायद, एक उत्परिवर्तित संस्करण भी अच्छा होगा।
mvmn

3
"शून्य निर्भरता के साथ सबसे सरल संभव पूर्ण समाधान" - लगता है जैसे आप जानते हैं कि क्या महत्वपूर्ण है! आपका उत्तर स्वीकृत एक इम्हो होना चाहिए। HttpClient के सभी को शामिल करना (सभी संस्करण अद्यतन के साथ और यहां तक ​​कि बहुत ही एपीआई इस सवाल को पदावनत करने के लिए) बस एक यूआरएल बनाने के लिए है जो शीर्ष-भारी बग-रिडल्ड एप्लिकेशन के लिए बनाता है।
स्टिजन डे विट

2
अंत में मावेन सेंट्रल पर, और मुझे काम करने में केवल चार साल लगे।
मिकेल ग्यूक

@mikaelhg धन्यवाद! मुझे इस क्षण में बिल्कुल ज़रूरत है!
फैबियन डैमकेन


29

HTTPClient का उपयोग करना अच्छी तरह से काम करता है।

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
यह अब पदावनत कार्यक्षमता है। क्या किसी को पता है कि नए HTTP Components पैकेज का उपयोग कैसे करना है क्योंकि यह मुझे स्टम्प्ड है।
Link19

3
नया 4x संस्करण इसके लिए कोई समर्थन नहीं करता है।
जोशा

13

बहुत सारे पुस्तकालय हैं जो आपको यूआरआई भवन (पहिया को फिर से मजबूत नहीं करने) में मदद कर सकते हैं। आपको शुरू करने के लिए यहां तीन हैं:


जावा ईई 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: वसंत-वेब: 4.2.5.RELEASE

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

इसे भी देखें: GIST> URI बिल्डर टेस्ट


2
EE 7 सही उत्तर है। आपको केवल ईई पुस्तकालयों के पूरे सुइट में खींचना है, एक JAX-RS कार्यान्वयन चुनें, jax-rs संस्करण संघर्षों को हल करें, और एक इनाम के रूप में आपके पास एक आसान UriBuilder वर्ग होगा जो वास्तव में अच्छी तरह से काम करता है। ताना एक तरफ, इस है सही जवाब। :)
टेकहेड

1
स्प्रिंग 5 के अनुसार चेक आउट करें UriBuilder( डॉक्स.सप्रिंग .io/spring-framework/docs/current/javadoc-api/org/… ) और UriBuilderFactory( docs.spring.io/spring-framework/docs/current/javadoc-api/org /… )
ब्राइस रॉनके

10

OkHttp का उपयोग करें

यह 2020 और वहाँ एक बहुत ही लोकप्रिय नामित पुस्तकालय है OkHttp जो तारांकित किया गया है 35K GitHub पर बार। इस पुस्तकालय के साथ, आप नीचे दिए गए एक यूआरएल का निर्माण कर सकते हैं:

import okhttp3.HttpUrl;

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

मैंने एक टाइपो तय किया, यह addPathSegment(नहीं addPathSegments) है।
पापाफ्रायड ३०'१

1

URL वर्ग का सुझाव देने के लिए लंबित होने के बाद। मैं टिप्पणीकार की सलाह लूंगा और इसके बजाय URI वर्ग का सुझाव दूंगा । मेरा सुझाव है कि आप एक यूआरआई के लिए कंस्ट्रक्टरों को करीब से देखते हैं क्योंकि एक बार बनाया गया वर्ग बहुत ही अपरिवर्तनीय है।
मुझे लगता है कि यह निर्माता आपको यूआरआई में वह सब कुछ सेट करने की अनुमति देता है जिसकी आपको आवश्यकता हो सकती है।

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

8
लेकिन यह वास्तव में नाम मान जोड़े के एक सेट से क्वेरी स्ट्रिंग के निर्माण और एनकोड करने के लिए कार्यक्षमता प्रदान नहीं करता है।
लिंक 19

4
जैसा कि बच्चे के कौतुक ने एलन पार्ट्रिज से कहा - किसी के पास अपरिवर्तनीयता का ह्रास नहीं हो सकता, यह या तो है या नहीं ;-) youtube.com/watch?v=_lvFns5Lubc
Stewart

यूआरआई के निर्माता रास्ते को गंदा करते हैं। ब्योरे के लिए देखें blog.palominolabs.com/2013/10/03/…
१ier

1
इस जवाब को एक उदाहरण के रूप में देखें कि यह कैसे करना है।
माइक पोन

1
स्ट्रिंग क्वेरी ... ग्रैन्युलैरिटी के लिए धन्यवाद सूर्य / ओरेकल। हम बस सभी प्रतीकों को प्लस प्रतीकों के साथ बदल देंगे, यूरी-एनकोडर सभी मापदंडों को जोड़ेंगे और उन सभी को एक साथ एम्परसैंड प्रतीकों के साथ जोड़ेंगे, फिर ... बार
टकराएंगे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.