Android में URI बिल्डर का उपयोग करें या चर के साथ URL बनाएं


202

मैं एक Android ऐप विकसित कर रहा हूं। मुझे एपीआई अनुरोध करने के लिए अपने ऐप के लिए एक यूआरआई बनाने की आवश्यकता है। जब तक एक URI में एक वैरिएबल डालने का दूसरा तरीका नहीं है, यह सबसे आसान तरीका है जो मैंने पाया है। मैंने पाया कि आपको उपयोग करने की आवश्यकता है Uri.Builder, लेकिन मुझे यकीन नहीं है कि कैसे। मेरा url है:

http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?key=[redacted]&mapid=value 

मेरी योजना http है, प्राधिकरण है lapi.transitchicago.com, पथ है /api/1.0, पथ खंड है ttarrivals.aspx, और क्वेरी स्ट्रिंग है key=[redacted]&mapid=value

मेरा कोड नीचे है:

Intent intent = getIntent();
String value = intent.getExtras().getString("value");
Uri.Builder builder = new Uri.Builder();
builder.scheme("http")
    .authority("www.lapi.transitchicago.com")
    .appendPath("api")
    .appendPath("1.0")
    .appendPath("ttarrivals.aspx")
    .appendQueryParameter("key", "[redacted]")
    .appendQueryParameter("mapid", value);

मैं समझता हूं कि मैं कर सकता हूं URI.add, लेकिन मैं इसे कैसे एकीकृत करूं Uri.Builder? क्या मुझे सबकुछ पसंद करना चाहिए URI.add(scheme), URI.add(authority)इत्यादि? या कि ऐसा करने का तरीका नहीं है? इसके अलावा, क्या URI / URL में वैरिएबल जोड़ने का कोई और आसान तरीका है?

जवाबों:


426

मान लीजिए कि मैं निम्नलिखित URL बनाना चाहता हूं:

https://www.myawesomesite.com/turtles/types?type=1&sort=relevance#section-name

इसे बनाने के लिए Uri.Builderमैं निम्नलिखित कार्य करूंगा।

Uri.Builder builder = new Uri.Builder();
builder.scheme("https")
    .authority("www.myawesomesite.com")
    .appendPath("turtles")
    .appendPath("types")
    .appendQueryParameter("type", "1")
    .appendQueryParameter("sort", "relevance")
    .fragment("section-name");
String myUrl = builder.build().toString();

1
मेरे पथ खंड के साथ, क्या यह एक मार्ग होगा? या यह एक क्वेरी होगी?
hichris123

यदि यह एक रास्ता है, तो यह appendPath()विधि के लिए होगा । यदि यह एक क्वेरी स्ट्रिंग (के बाद आ रहा है?) तो उपयोग करें appendQueryParameter()। उस URL पर एक नज़र डालें जिसका मेरे पास उदाहरण है और मैं प्रत्येक खंड के साथ क्या कर रहा हूं। मैंने उचित प्रकार वापस पाने के toString()लिए build()कॉल में भी जोड़ा ।
डेविड

1
यह प्रश्न चिह्न से पहले का है, लेकिन इसमें / a नहीं है। यह ऊपर मेरे सवाल पर ttarrivals.aspx है। तो यह एक रास्ता होगा?
hichris123

सही बात। यह सिर्फ रास्ते का अंत होता है। यदि आप चाहते हैं तो तकनीकी रूप से आप अंत में "/" डाल सकते हैं और यह मान्य होगा। mysite.com/path रूप में ही है mysite.com/path
डेविड

1
एकदम सही जवाब! यह एपीआई प्रलेखन में पहले से ही होना चाहिए था।
रॉबिनमित्र

259

उपयोग करने का एक और तरीका है Uriऔर हम एक ही लक्ष्य प्राप्त कर सकते हैं

http://api.example.org/data/2.5/forecast/daily?q=94043&mode=json&units=metric&cnt=7

उड़ी बनाने के लिए आप इसका उपयोग कर सकते हैं:

final String FORECAST_BASE_URL = 
    "http://api.example.org/data/2.5/forecast/daily?";
final String QUERY_PARAM = "q";
final String FORMAT_PARAM = "mode";
final String UNITS_PARAM = "units";
final String DAYS_PARAM = "cnt";

आप सभी इस ऊपर जिस तरह की घोषणा कर सकते हैं या यहां तक कि अंदर Uri.parse()औरappendQueryParameter()

Uri builtUri = Uri.parse(FORECAST_BASE_URL)
    .buildUpon()
    .appendQueryParameter(QUERY_PARAM, params[0])
    .appendQueryParameter(FORMAT_PARAM, "json")
    .appendQueryParameter(UNITS_PARAM, "metric")
    .appendQueryParameter(DAYS_PARAM, Integer.toString(7))
    .build();

अंत में

URL url = new URL(builtUri.toString());

14
आप अधिक वोट के लायक हैं! मेरे लिए, मूल उपयोग मामला तब है जब आपके पास पहले से परिभाषित स्ट्रिंग URL है, और आप पैरामीटर जोड़ना / जोड़ना चाहते हैं!
लोरेंजो-एस

1
मैं धूप (इस सटीक स्ट्रिंग) के लिए एक समाधान की तलाश कर रहा था, लेकिन सबसे अधिक मतदान प्रश्न बहुत अधिक मजबूत समाधान प्रदान करता है।
नाहम

1
Uri.buildUpon () संकेत के लिए धन्यवाद! मुझे कुछ सिरदर्द से बचाया।
chrjs

मुझे इस बात में भ्रम था कि url किस क्रम में बनाया गया है, क्योंकि निश्चित रूप से इसका एकमात्र वैरिएबल पूरा url नहीं है, जिसे हमें बनाना है
blackHawk

क्या होगा यदि मेरे पास आधार url नहीं है, बल्कि पूर्ण url है? Parse + BuildUpon + AppendQueryParam + Build का उपयोग करके मुझे एक गैर वैध url ([डोमेन] [queryParams] [पथ] [डोमेन] [पथ] [queryParams]) की जगह
मिलती है

20

ऊपर से उत्कृष्ट उत्तर एक साधारण उपयोगिता विधि में बदल गया।

private Uri buildURI(String url, Map<String, String> params) {

    // build url with parameters.
    Uri.Builder builder = Uri.parse(url).buildUpon();
    for (Map.Entry<String, String> entry : params.entrySet()) {
        builder.appendQueryParameter(entry.getKey(), entry.getValue());
    }

    return builder.build();
}

कोई ज़रूरत नहीं है UTF8 सामग्री परिवर्तित करें?
वेबसर्विस

15

यहाँ यह समझाने का एक अच्छा तरीका है:

यूआरआई के दो रूप हैं

1 - बिल्डर ( संशोधित होने के लिए तैयार है , उपयोग करने के लिए तैयार नहीं है )

2 - निर्मित ( संशोधित होने के लिए तैयार नहीं , उपयोग करने के लिए तैयार )

आप द्वारा एक बिल्डर बना सकते हैं

Uri.Builder builder = new Uri.Builder();

इस तरह से संशोधित किया जा करने के लिए तैयार एक बिल्डर लौटने वाला : -

builder.scheme("https");
builder.authority("api.github.com");
builder.appendPath("search");
builder.appendPath("repositories");
builder.appendQueryParameter(PARAMETER_QUERY,parameterValue);

लेकिन इसका उपयोग करने के लिए आपको पहले इसका निर्माण करना होगा

retrun builder.build();

या हालाँकि आप इसका उपयोग करने वाले हैं। और फिर आपने बनाया है कि पहले से ही आपके लिए बनाया गया है, उपयोग करने के लिए तैयार है, लेकिन संशोधित नहीं किया जा सकता है।

Uri built = Uri.parse("your URI goes here");

यह उपयोग करने के लिए तैयार है, लेकिन यदि आप इसे संशोधित करना चाहते हैं तो आपको बिल्डअप () की आवश्यकता होगी

Uri built = Uri.parse("Your URI goes here")
           .buildUpon(); //now it's ready to be modified
           .buildUpon()
           .appendQueryParameter(QUERY_PARAMATER, parameterValue) 
           //any modification you want to make goes here
           .build(); // you have to build it back cause you are storing it 
                     // as Uri not Uri.builder

अब हर बार जब आप इसे संशोधित करना चाहते हैं तो आपको इसकी आवश्यकता होगी buildUpon () और अंत में build () करने की आवश्यकता होती है

तो Uri.Builder एक बिल्डर प्रकार है जो इसमें एक बिल्डर को संग्रहीत करता है। उरी एक निर्मित प्रकार है जो इसमें पहले से निर्मित यूआरआई को संग्रहीत करता है।

new Uri.Builder (); एक बिल्डर को पुनर्व्यवस्थित करता है । Uri.parse ("आपका यूआरआई यहां जाता है") एक निर्मित रिटर्न देता है ।

और बिल्ड () के साथ आप इसे बिल्डर से बिल्ट में बदल सकते हैं । buildUpon () आप इसे बिल्ट से बिल्डर में बदल सकते हैं । यहाँ आप क्या कर सकते हैं

Uri.Builder builder = Uri.parse("URL").buildUpon();
// here you created a builder, made an already built URI with Uri.parse
// and then change it to builder with buildUpon();
Uri built = builder.build();
//when you want to change your URI, change Builder 
//when you want to use your URI, use Built

और इसके विपरीत: -

Uri built = new Uri.Builder().build();
// here you created a reference to a built URI
// made a builder with new Uri.Builder() and then change it to a built with 
// built();
Uri.Builder builder = built.buildUpon();

आशा है कि मेरे उत्तर से मदद मिली :) <3


6

उदाहरण के लिए second Answerमैंने उसी URL के लिए इस तकनीक का उपयोग किया था

http://api.example.org/data/2.5/forecast/daily?q=94043&mode=json&units=metric&cnt=7

Uri.Builder builder = new Uri.Builder();
            builder.scheme("https")
                    .authority("api.openweathermap.org")
                    .appendPath("data")
                    .appendPath("2.5")
                    .appendPath("forecast")
                    .appendPath("daily")
                    .appendQueryParameter("q", params[0])
                    .appendQueryParameter("mode", "json")
                    .appendQueryParameter("units", "metric")
                    .appendQueryParameter("cnt", "7")
                    .appendQueryParameter("APPID", BuildConfig.OPEN_WEATHER_MAP_API_KEY);

फिर निर्माण के बाद इसे URLइस तरह से प्राप्त करें

URL url = new URL(builder.build().toString());

और एक कनेक्शन खोलें

  HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

और यदि लिंक simpleउदाहरण के लिए, लोकेशन की तरह है

geo:0,0?q=29203

Uri geoLocation = Uri.parse("geo:0,0?").buildUpon()
            .appendQueryParameter("q",29203).build();

2
URL url = new URL(builder.build().toString());को MalformedURLException
Ali Kazi

2

उपयोग करने से appendEncodePath()आप कई पंक्तियों को सहेज सकते हैं appendPath(), निम्न कोड स्निपेट इस url को बनाता है:http://api.openweathermap.org/data/2.5/forecast/daily?zip=94043

Uri.Builder urlBuilder = new Uri.Builder();
urlBuilder.scheme("http");
urlBuilder.authority("api.openweathermap.org");
urlBuilder.appendEncodedPath("data/2.5/forecast/daily");
urlBuilder.appendQueryParameter("zip", "94043,us");
URL url = new URL(urlBuilder.build().toString());

2

सर्वश्रेष्ठ उत्तर: https://stackoverflow.com/a/19168199/413127

के लिए उदाहरण

 http://api.example.org/data/2.5/forecast/daily?q=94043&mode=json&units=metric&cnt=7

अब कोटलिन के साथ

 val myUrl = Uri.Builder().apply {
        scheme("https")
        authority("www.myawesomesite.com")
        appendPath("turtles")
        appendPath("types")
        appendQueryParameter("type", "1")
        appendQueryParameter("sort", "relevance")
        fragment("section-name")
        build()            
    }.toString()

कोटलिन संस्करण को जोड़ने के लिए धन्यवाद :)
एम मंसूर

0

आप ऐसा कर सकते हैं कि मेमने के भाव के साथ;

    private static final String BASE_URL = "http://api.example.org/data/2.5/forecast/daily";

    private String getBaseUrl(Map<String, String> params) {
        final Uri.Builder builder = Uri.parse(BASE_URL).buildUpon();
        params.entrySet().forEach(entry -> builder.appendQueryParameter(entry.getKey(), entry.getValue()));
        return builder.build().toString();
    }

और आप इस तरह परम बना सकते हैं;

    Map<String, String> params = new HashMap<String, String>();
    params.put("zip", "94043,us");
    params.put("units", "metric");

Btw। यदि आप किसी भी समस्या का सामना करेंगे “lambda expressions not supported at this language level”, तो कृपया इस URL की जाँच करें;

https://stackoverflow.com/a/22704620/2057154

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.