অ্যান্ড্রয়েডে ইউআরআই বিল্ডার ব্যবহার করুন বা ভেরিয়েবলগুলি সহ URL তৈরি করুন


202

আমি একটি অ্যান্ড্রয়েড অ্যাপ বিকাশ করছি। আমার অ্যাপ্লিকেশনটির জন্য একটি এপিআই অনুরোধ করতে আমার একটি ইউআরআই তৈরি করতে হবে। ইউআরআইতে ভেরিয়েবল রাখার অন্য কোনও উপায় না থাকলে, এটি আমার কাছে পাওয়া সহজতম উপায়। আমি আপনাকে ব্যবহার করতে হবে যে পাওয়া যায় নি Uri.Builder, কিন্তু আমি কিভাবে নিশ্চিত তা নিশ্চিত না। আমার ইউআরএলটি হ'ল:

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)এবং তাই? নাকি এটি করার উপায় নয়? এছাড়াও, কোনও ইউআরআই / ইউআরএলতে ভেরিয়েবল যুক্ত করার কোনও সহজ উপায় আছে কি?

উত্তর:


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()। উদাহরণটিতে আমার থাকা ইউআরএল এবং প্রতিটি বিভাগের সাথে আমি কী করছি তা একবার দেখুন। আমি সঠিক টাইপ ফিরে পেতে কল যোগ toString()করা build()
ডেভিড

1
এটি প্রশ্ন চিহ্নের আগে, তবে এটির একটি / এর পরে নেই। এটি উপরের আমার প্রশ্নের উপর 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
আপনি আরও ভোট প্রাপ্য! আমার জন্য, প্রাথমিক ব্যবহারের ক্ষেত্রেটি যখন আপনার ইতিমধ্যে সংজ্ঞায়িত স্ট্রিং ইউআরএল থাকে এবং আপনি প্যারামিটার যুক্ত / যুক্ত করতে চান!
লরেঞ্জো-এস

1
আমি রৌদ্রের জন্য এই সমাধানটির সন্ধান করছিলাম (এই সঠিক স্ট্রিং) তবে সর্বাধিক ভোট দেওয়া প্রশ্নটি আরও অনেক শক্তিশালী সমাধান সরবরাহ করে।
নাহুম

1
Uri.buildUpon () ইঙ্গিতটির জন্য ধন্যবাদ! কিছু মাথা ব্যথা বাঁচিয়েছি।
chrjs

ইউআরএলটি কী অর্ডার তৈরি হয় তা নিয়ে আমি বিভ্রান্ত হয়ে পড়েছিলাম কারণ অবশ্যই এটির কেবলমাত্র ভেরিয়েবলগুলি সম্পূর্ণ ইউআরএল নয়, যা আমাদের করতে হবে
ব্ল্যাকহক

যদি আমার কাছে বেস ইউআরএলটি না থাকে তবে সম্পূর্ণ ইউআরএল পরিবর্তে কী হয়? পার্স + বিল্ডআপ্পেন + অ্যাপেন্ডকুয়ারীপ্যারাম + বিল্ড ব্যবহার করে আমি [ডোমেন] [পথ] [ক্যোয়ারীপ্যারামস] এর পরিবর্তে একটি বৈধ url ([ডোমেন] [কোয়েরিপ্যারামস]] [পাথ])
পেয়েছি

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();
}

ইউটিএফ 8 সামগ্রী রূপান্তর করার দরকার নেই?
ওয়েবজারিস

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

এখন যতবারই আপনি এটি পরিবর্তন করতে চান আপনার বিল্ডআপ () এবং শেষের বিল্ডে () দরকার

সুতরাং উরি.বিল্ডার একটি বিল্ডার টাইপ যা এতে কোনও বিল্ডার সঞ্চয় করে। উরি একটি বিল্ট টাইপ যা এতে ইতিমধ্যে নির্মিত ইউআরআই সংরক্ষণ করে।

নতুন উরি.বিল্ডার (); একজন বিল্ডারকে পুনরায় চালু করে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আমি একই কৌশলটির জন্য এই কৌশলটি ব্যবহার করেছি

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());মালফর্মিউরলেক্সসেপশন
আলি কাজী

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.