অ্যান্ড্রয়েডে কোয়েরি স্ট্রিংগুলি পার্সিং করা হচ্ছে


271

জাভা ইই এর সার্লেটলেকুয়েস্ট.জেটপ্যারামিটারভ্যালু () রয়েছে

নন-ইই প্ল্যাটফর্মগুলিতে, URL.getQuery () কেবল স্ট্রিং দেয়।

জাভা ইই না থাকা অবস্থায় কোনও ইউআরএলে ক্যোরি স্ট্রিংটি সঠিকভাবে পার্স করার সাধারণ উপায় কী ?


< রেন্ট >

এটি চেষ্টা করে নিজের পার্সার তৈরির উত্তরগুলিতে জনপ্রিয়। এটি অত্যন্ত আকর্ষণীয় এবং উত্তেজনাপূর্ণ মাইক্রো কোডিং প্রকল্প, তবে আমি এটি বলতে পারি না যে এটি একটি ভাল ধারণা :(

নীচের কোড স্নিপেটগুলি সাধারণত ত্রুটিযুক্ত বা ভাঙা, বিটিডাব্লু। সেগুলি ভাঙা পাঠকের জন্য একটি আকর্ষণীয় অনুশীলন। এবং হ্যাকারগুলিকে আক্রমণকারী ওয়েবসাইটগুলিতে যা তাদের ব্যবহার করে

ক্যোয়ারী স্ট্রিংগুলি পার্সিং একটি ভাল সংজ্ঞায়িত সমস্যা তবে স্পেকটি পড়া এবং সংক্ষিপ্তকরণগুলি বোঝা অযৌক্তিক। কিছু প্ল্যাটফর্ম লাইব্রেরি কোডারকে আপনার জন্য কঠোর পরিশ্রম করতে দেওয়া এবং ফিক্সিংয়ের কাজটি করা আরও ভাল!

< / rant >


আপনি কি একটি নমুনা ইউআরএল পোস্ট getQuery()করতে পারেন, আপনি কী পেয়েছেন এবং আউটপুট হিসাবে আপনি কী পেতে চান?
টমাস ওভেনস

1
আপনি কি কোনও সার্লেট বা জেএসপি পৃষ্ঠা থেকে এটি করতে চাইছেন? আমি উত্তর দেওয়ার আগে আমার কিছু স্পষ্টতা দরকার।
চাদএনসি

1
আপনার কি POST পরামিতিগুলি পার্স করা দরকার?
থিলো

2
আপনি J2EE এ থাকলেও (বা আমার মতো OSGi এর মাধ্যমে নির্বাচিত EE প্যাকেজ যুক্ত এসই তেও), এই প্রশ্নটি বোধগম্য হতে পারে। আমার ক্ষেত্রে, ক্যোরি স্ট্রিংগুলি / ইউআরএল-এনকোডেড পোষ্ট বডিগুলি সিস্টেমের এমন একটি অংশ দ্বারা প্রক্রিয়া করা হয় যা ইচ্ছাকৃতভাবে স্টাফগুলিতে অজ্ঞাতসৃষ্টিকৃত হয় ServletRequest
হ্যানো ফিয়েজ

61
<রেন্ট /> এর জন্য উত্সাহিত!
এখনকার

উত্তর:


65

যেহেতু অ্যান্ড্রয়েড এম জিনিসগুলি আরও জটিল হয়ে উঠেছে। উত্তর android.net.URI .getQueryParameter () একটি বাগ যা Jellybean এর আগে স্পেস ভঙ্গ হয়েছে। এ্যাপাচি URLEncodedUtils.parse () কাজ করেন, কিন্তু ছিল ঠ অবচিত এবং এম সরানো

সুতরাং এখন সেরা উত্তরটি হল urlQuerySanizzer । এটি এপিআই স্তর 1 সাল থেকে বিদ্যমান এবং এখনও বিদ্যমান। এটি কীভাবে আপনি বিশেষ চরিত্রগুলি পরিচালনা করেন বা পুনরাবৃত্ত মানগুলির মতো কৌতুকপূর্ণ বিষয়গুলি সম্পর্কে আপনাকে ভাবিয়ে তোলে।

সবচেয়ে সহজ কোডটি

UrlQuerySanitizer.ValueSanitizer sanitizer = UrlQuerySanitizer.getAllButNullLegal();
// remember to decide if you want the first or last parameter with the same name
// If you want the first call setPreferFirstRepeatedParameter(true);
sanitizer.parseUrl(url);
String value = sanitizer.getValue("paramName"); // get your value

আপনি যদি ডিফল্ট পার্সিং আচরণে খুশি হন তবে আপনি এটি করতে পারেন:

new UrlQuerySanitizer(url).getValue("paramName")

তবে আপনার নিশ্চিত হওয়া উচিত যে আপনি ডিফল্ট পার্সিং আচরণটি কী তা বুঝতে পেরেছেন, কারণ এটি আপনি যা চান তা নাও হতে পারে।


4
ইউআরএলকিউরিস্যানিটাইজার.জেটআলবুটনাল লেগল () UrlQuerySanitizer.ValueSanizzer প্রদান করে, urlQuerySanitizer নয়।
পিটার ঝাও

31
কোনও কারণে UrlQuerySanitizer sanitizer = new UrlQuerySanitizer(YourStringURL); String value = sanitizer.getValue("parameter");
উপরেরগুলি

3
কাজ করে না. UrlQuerySanitizer এসডিকে sanitize()
নিনজা

এটি বিশেষ অক্ষর এবং ইমোজি ডিকোড করবে _। আমাকে
স্ট্যাকওভারফ্লো.

এর একটি বসন্ত কাঠামো সমতুল্য গ্রন্থাগার আছে?
iamjoshu

202

অ্যান্ড্রয়েডে:

import android.net.Uri;

[...]

Uri uri=Uri.parse(url_string);
uri.getQueryParameter("para1");

20
নোট করুন যে এটি ইউরি ক্লাস ব্যবহার করে এবং ইউআরআই ক্লাসটি ব্যবহার করে না (উরি অ্যান্ড্রয়েড.net এর অংশ, যখন ইউআরআই জাভা নেট এর অংশ)
মারিয়াস

5
এছাড়াও খেয়াল করুন যে আইসক্রিম স্যান্ডউইচের আগে, এটি একটি স্পেস ক্যারেক্টারের মানগুলিতে + অক্ষরকে পার্স করতে ব্যর্থ হয়।
রাপেরিচ

@ প্রের্তরিচ আসলে ডক্স বলছে যে আইসক্রিম স্যান্ডউইচ সহ জেলি বিনের আগে বাগটি রয়েছে। রেফ
বিগ ম্যাকলার্জহিউজ

64

অ্যান্ড্রয়েডে, অ্যাপাচি লাইব্রেরিগুলি কোয়েরি পার্সার সরবরাহ করে:

http://developer.android.com/references/org/apache/http/client/utils/URLEncodedUtils.html এবং http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/ HTTP / ক্লায়েন্ট / utils / URLEncodedUtils.html


9
এটি কেবল অ্যান্ড্রয়েড নয়, অ্যাপাচি HTTP ক্লায়েন্ট লাইব্রেরিতে পাওয়া যায়। বিটিডব্লিউ, অ্যাপাচে লিঙ্কটি পরিবর্তন করা হয়েছিল। সর্বশেষতম
ক্রিশ্চিয়ান

9
বিরক্তিকররূপে URLEncodedUtils.parse()একটি ফিরিয়ে দেয় Listযা আপনাকে একটি নির্দিষ্ট কীটির জন্য মানটি খুঁজে বের করতে হবে। এটি Mapবালুসকের উত্তরের মতো কোনও মত ফেরত দিলে এটি খুব সুন্দর হবে ।
আসফ

1
@ হ্যানো ফিয়েজ আপনি কী বোঝাতে চান এই বিকল্পগুলিতে বিশ্বাস রাখছেন ? আমি জানি তারা বগি। আমি জানি যে আমি যে বাগগুলি দেখি সেগুলি কেবলমাত্র 'নির্ধারিত' সংস্করণগুলি গ্রহণ করতেই মানুষকে উত্সাহিত করবে, বরং আমি যে বাগগুলি উপেক্ষা করেছি সেগুলি অনুসন্ধান করার পরিবর্তে।
উইল

1
@ উইল - ভাল, আমি কখনই কোনও ওয়েবসাইট থেকে পাওয়া কপি-পেস্ট স্নিপেটগুলিতে বিশ্বাস করব না , এবং কারও উচিত নয়। তবে এখানে, এই স্নিপেটগুলি বরং ভালভাবে পর্যালোচনা করা হয়েছে এবং এতে মন্তব্য করা হয়েছে এবং এটি areআসলে সহায়ক। কোডটির সাথে কী কী ভুল হতে পারে সে সম্পর্কে কিছু পরামর্শ কেবল নিজের জন্য চিন্তাভাবনা করার জন্য ইতিমধ্যে একটি দুর্দান্ত সহায়তা। এবং মনে রাখবেন, আমি বলতে চাইনি "নিজের নিজের রোল ভাল" বলতে চাইনি, বরং এটি আমার নিজের কোডে একটি অবগত সিদ্ধান্তের জন্য ভাল উপাদান থাকা দুর্দান্ত।
হ্যানো ফিয়েজ 23'11

8
আমি কল্পনা করি পার্স একটি তালিকা ফেরত দেয় যাতে এটি অবস্থানগত ক্রম বজায় রাখে এবং আরও সহজেই নকল প্রবেশগুলিকে মঞ্জুরি দেয়।
dhaag23

26

বালাসসির উত্তর এখানে , তবে এটি সংকলন করে এবং ফলাফলগুলি প্রদান করে:

public static Map<String, List<String>> getUrlParameters(String url)
        throws UnsupportedEncodingException {
    Map<String, List<String>> params = new HashMap<String, List<String>>();
    String[] urlParts = url.split("\\?");
    if (urlParts.length > 1) {
        String query = urlParts[1];
        for (String param : query.split("&")) {
            String pair[] = param.split("=");
            String key = URLDecoder.decode(pair[0], "UTF-8");
            String value = "";
            if (pair.length > 1) {
                value = URLDecoder.decode(pair[1], "UTF-8");
            }
            List<String> values = params.get(key);
            if (values == null) {
                values = new ArrayList<String>();
                params.put(key, values);
            }
            values.add(value);
        }
    }
    return params;
}

1
জেভিএম নোট: আমি জাভা সংগ্রহগুলি ব্যবহার করে স্কালায় এর সমতুল্য রূপটি প্রয়োগ করেছি; এখানে গিথুব গিস্টটি রয়েছে
জে টেলর

2
আমি পরিবর্তন করার পরামর্শ দিই String pair[] = param.split("=");মধ্যে String pair[] = param.split("=", 2);শুধুমাত্র প্রথম সংঘটন কী = মান জোড়া বিভক্ত করতে। আমি বিশ্বাস করি যে এটিতে মানকবিহীন সমান চিহ্নগুলির মঞ্জুরি রয়েছে।
ডেনি

22

আপনার ক্লাসপথে জেটি (সার্ভার বা ক্লায়েন্ট) লিবস থাকলে আপনি জেটি ব্যবহারের ক্লাস ব্যবহার করতে পারেন ( জাভাদোক দেখুন ), যেমন:

import org.eclipse.jetty.util.*;
URL url = new URL("www.example.com/index.php?foo=bar&bla=blub");
MultiMap<String> params = new MultiMap<String>();
UrlEncoded.decodeTo(url.getQuery(), params, "UTF-8");

assert params.getString("foo").equals("bar");
assert params.getString("bla").equals("blub");

13

যদি আপনি স্প্রিং ৩.১ বা ততোধিক ব্যবহার করেন (হাই, আশা ছিল যে সমর্থন আরও পিছিয়ে গেছে), আপনি UriComponentsএবং ব্যবহার করতে পারেন UriComponentsBuilder:

UriComponents components = UriComponentsBuilder.fromUri(uri).build();
List<String> myParam = components.getQueryParams().get("myParam");

components.getQueryParams() ফেরত a MultiValueMap<String, String>

এখানে আরও কিছু ডকুমেন্টেশন রয়েছে


এটি এমন কিছু যা আমি খুঁজছি। আমার প্রশ্ন আমি কীভাবে ইউরি পাব? আমি কোড রক্ষণাবেক্ষণের সাথে আটকে আছি যে আমি খুব বেশি পরিবর্তন করতে পারি না এবং আমরা এইচটিপি সার্ভলেট ব্যবহার করি না। কেবল টীকাগুলি এবং স্প্রিং (@ গেট, @ প্রোডাকস (মিডিয়াটাইপ) এবং @ পাথ ("/ ডেটাএএসজেএসএন / ডেটাফিল্ড / {ডেটাফিল্ড})) ব্যবহার না করে কেবল ক্যোয়ারী স্ট্রিংটি কীভাবে পাওয়া যায় তা জানতে হবে যাতে আমি এটিকে যেমন দেখছি ঠিক তেমন পার্স করতে পারি এই উদাহরণ।
Nelda.techspiress

5

কোনও সার্লেট বা জেএসপি পৃষ্ঠার জন্য আপনি অনুরোধ.জিটপ্যারামিটার ("প্যারামনেম") ব্যবহার করে ক্যোরিস্ট্রিং কী / মান জোড়া পেতে পারেন you

String name = request.getParameter("name");

এটি করার অন্যান্য উপায় আছে তবে আমি তৈরি করা সমস্ত সার্লেট এবং jsp পৃষ্ঠাগুলিতে আমি এটি করি।


3
এইচটিপিএস সার্লেটRequest J2EE এর অংশ যা তার নেই। এছাড়াও getPramter () ব্যবহার করা আসলে পার্সিং নয়।
মিঃ শাইনি এবং নিউ 宇 宇

3
আমি যে মন্তব্যটিতে তার প্রশ্নের স্পষ্টতা চেয়েছিলাম তা পড়তে দয়া করে সময় দিন। এই উত্তরটি সেই মন্তব্যে তার উত্তরের প্রতিক্রিয়া হিসাবে যেখানে তিনি বলেছিলেন, "আমি অ্যান্ড্রয়েডে এটি করার চেষ্টা করছি, তবে সমস্ত প্ল্যাটফর্মের সমস্ত উত্তর দরকারী উত্তর হতে পারে যা পয়েন্টার দিতে পারে (অন্যরা যারা এই জুড়ে আসতে পারে তাদেরও প্রশ্ন) তাই পিছনে রাখা হবে না! " আমি তার মন্তব্যের ভিত্তিতে তার প্রশ্নের উত্তর দিয়েছি। আপনার যুক্ত করতে দরকারী কিছু না থাকলে, কিছু যুক্ত করবেন না
চাদএনসি

1
খুব মন খারাপ করবেন না। "এটি প্রশ্নের উত্তর দেয় না" যুক্ত করতে দরকারী, আইএমও।
মিঃ শাইনি এবং নিউ 安 宇

1
এটি অ্যান্ড্রয়েড বা না-ই গুরুত্বপূর্ণ নয়, প্রশ্নটি কীভাবে ইউআরএলযুক্ত স্ট্রিংকে পার্স করা যায় এবং এর থেকে URL প্যারামিটারগুলি কীভাবে পাওয়া যায়। আপনি এখানে যে পোর্ট করছেন সেটি হ'ল সার্লেট এপিআই-র অংশ, যেখানে সার্লেলেট ধারক আপনার জন্য HTTP অনুরোধ থেকে আগত প্যারামিটারগুলি পার্স করে। এটি অপ্রাসঙ্গিক, কারণ প্রশ্নটি স্ট্রিংকে পার্সিং সম্পর্কিত যা URL টি রয়েছে, HTTP অনুরোধ নয়, এবং সার্লেট পাত্রে নেই।
mvmn

5

অ্যান্ড্রয়েড, আমি @diyism উত্তর ব্যবহার করার চেষ্টা কিন্তু আমি স্থান অক্ষর @rpetrich দ্বারা উত্থাপিত ইস্যু, উদাহরণস্বরূপ সম্মুখীন হয়েছে: আমি একটি ফর্ম পূরণ যেখানে username = "us+us"এবং password = "pw pw"মত চেহারা করা জন্য একটি URL স্ট্রিং ঘটাচ্ছে:

http://somewhere?username=us%2Bus&password=pw+pw

যাইহোক, @diyism কোড ফিরে আসে "us+us"এবং "pw+pw", যেমন এটি স্থানের অক্ষর সনাক্ত করে না। যদি ইউআরএলটি %20স্থানের অক্ষর দিয়ে আবার লিখিত হয় তবে তা সনাক্ত করা যায়:

http://somewhere?username=us%2Bus&password=pw%20pw

এটি নিম্নলিখিত সমাধানের দিকে নিয়ে যায়:

Uri uri = Uri.parse(url_string.replace("+", "%20"));
uri.getQueryParameter("para1");

replace(" ", "%20")এটা ভুল মনে হচ্ছে। তবে আমার জন্য কৌতুকটি করেছেন: ডি
মার্তিয়ে ব্রিডিস

সঠিক বাক্য গঠনটি "কিছু স্ট্রিং" হওয়া উচিত .rerereAll ("[+]", "% 20");
আরআরটিডব্লিউ

4

আপনি কতটা ক্ষমাশীল হতে চান তার উপর নির্ভর করে ক্যোরিয় স্ট্রিংটিকে পার্সিং করা মনে হয় তার চেয়ে কিছুটা জটিল।

প্রথমত, ক্যোরির স্ট্রিংটি আসকি বাইট। আপনি এই বাইটগুলিতে একবারে পড়েন এবং এগুলিকে অক্ষরে রূপান্তর করেন। চরিত্রটি যদি হয়? অথবা & এর পরে এটি প্যারামিটার নামের শুরুতে সংকেত দেয়। অক্ষরটি যদি = হয় তবে এটি পরামিতি মানটির সূচনা করে। অক্ষরটি যদি% হয় তবে এটি কোনও এনকোডড বাইটের সূচনা করার ইঙ্গিত দেয়। এখানেই এটি জটিল হয়ে ওঠে।

আপনি যখন% চরটিতে পড়েন আপনাকে পরবর্তী দুটি বাইট পড়তে হবে এবং সেগুলি হেক্স অঙ্ক হিসাবে ব্যাখ্যা করতে হবে। তার মানে পরবর্তী দুটি বাইট হবে 0-9, AF বা এএফ। আপনার বাইট মান পেতে এই দুটি হেক্স ডিজিটকে একসাথে আঠালো করুন। তবে মনে রাখবেন, বাইট অক্ষর নয় । অক্ষরগুলি এনকোড করার জন্য আপনাকে কী এনকোডিং ব্যবহার করা হয়েছিল তা জানতে হবে। অক্ষর ইউটিএফ -8 তে একইভাবে এনকোড করে না যেমন এটি আইএসও -8859-1-তে ঘটে। সাধারণভাবে প্রদত্ত চরিত্রের সেটটির জন্য কী এনকোডিং ব্যবহৃত হয়েছিল তা জানা অসম্ভব। আমি সর্বদা ইউটিএফ -8 ব্যবহার করি কারণ আমার ওয়েবসাইটটি সর্বদা ইউটিএফ -8 ব্যবহার করে সমস্ত কিছু পরিবেশন করার জন্য কনফিগার করা থাকে তবে বাস্তবে আপনি নিশ্চিত হতে পারবেন না। কিছু ব্যবহারকারী-এজেন্ট আপনাকে অনুরোধে অক্ষর এনকোডিংটি বলবে; আপনার যদি সম্পূর্ণ HTTP অনুরোধ থাকে তবে আপনি এটি পড়ার চেষ্টা করতে পারেন। আপনার যদি সবে বিচ্ছিন্নভাবে url থাকে তবে শুভকামনা।

যাইহোক, ধরে নিই যে আপনি ইউটিএফ -8 বা কিছু অন্যান্য মাল্টি-বাইট অক্ষর এনকোডিং ব্যবহার করছেন, এখন আপনি যখন একটি এনকোডড বাইট ডিকোড করেছেন আপনাকে পরবর্তী বাইটটি ক্যাপচার না করা পর্যন্ত এটিকে আলাদা করে রাখতে হবে। আপনার একসাথে থাকা সমস্ত এনকোডযুক্ত বাইট প্রয়োজন কারণ আপনি একবারে এক বাইট সঠিকভাবে url- ডিকোড করতে পারবেন না। একসাথে থাকা সমস্ত বাইটগুলি আলাদা করে রাখুন এবং আপনার চরিত্রটিকে পুনর্গঠন করতে একবারে এগুলি সমস্ত ডিকোড করুন।

এছাড়াও আপনি যদি সুস্থ হয়ে উঠতে চান এবং ব্যবহারকারী-এজেন্টদের জন্য অ্যাকাউন্ট করতে চান যা ইউআরএলগুলি মঙ্গাল করে। উদাহরণস্বরূপ, কিছু ওয়েবমেল ক্লায়েন্টগুলি জিনিসগুলি ডাবল-এনকোড করে। অথবা? & = অক্ষর দ্বিগুণ করুন (উদাহরণস্বরূপ http://yoursite.com/blah??p1==v1&&p2==v2:)। আপনি যদি দয়া করে এর সাথে ডিল করার চেষ্টা করতে চান তবে আপনার পার্সারে আরও যুক্তি যুক্ত করতে হবে।


এটি কীভাবে কী কী স্ট্রিং প্যারামিটার মানগুলি বিশ্লেষণ বা পুনরুদ্ধার করবেন তা ব্যাখ্যা করে না
চাদএনসি

ঠিক আছে, তবে কিছুটা জটিল। এর জন্য আমাদের ইতিমধ্যে ইউআরএলডেকোডার রয়েছে।
বালুসসি

2
@ চ্যাডনিসি: তৃতীয় বাক্য আপনাকে কীভাবে পার্স করবেন তা জানায়: একবারে এক বাইটে পড়ুন এবং চরগুলিতে রূপান্তর করতে হবে। চতুর্থ বাক্য আপনাকে বিশেষ চরিত্র সম্পর্কে সতর্ক করে। ইত্যাদি হয়ত আপনি উত্তরটি পড়েন নি?
মিঃ শাইনি এবং নিউ 安 宇

@ বালুসসি: ইউআরএলডেকোডার কাজ করে তবে আপনি কোন ধরণের ইউআরএল গ্রহণ করেন সে সম্পর্কে যদি আরও হালকা হওয়ার চেষ্টা করছেন তবে এর কিছু ব্যর্থতা মোড রয়েছে।
মিঃ শাইনি এবং নিউ 宇 宇

1
@ মিঃ শাইনিএন্ড নতুন পার্স ক্যোয়ারী পরমের সাথে সম্মত হন সহজ নয়। আমি এফআইকিউএলকে সমর্থন করছি এবং এটি পাছার সত্যিকারের ব্যথা হয়ে উঠবে। উদাহরণ: yoursite.com/blah??p1==v1&&p2==v2,p2==v3;p2==v4
rafa.ferreira

4

অ্যান্ড্রয়েডে নীচের কোড হিসাবে এটি সহজ:

UrlQuerySanitizer sanitzer = new UrlQuerySanitizer(url);
String value = sanitzer.getValue("your_get_parameter");

এছাড়াও আপনি যদি প্রতিটি প্রত্যাশিত ক্যোয়ারী কী ব্যবহারটি নিবন্ধ করতে চান না:

sanitzer.setAllowUnregisteredParamaters(true)

কল করার আগে:

sanitzer.parseUrl(yourUrl)

4

এটি অর্জনের জন্য আমার কাছে পদ্ধতি রয়েছে:

1) :

public static String getQueryString(String url, String tag) {
    String[] params = url.split("&");
    Map<String, String> map = new HashMap<String, String>();
    for (String param : params) {
        String name = param.split("=")[0];
        String value = param.split("=")[1];
        map.put(name, value);
    }

    Set<String> keys = map.keySet();
    for (String key : keys) {
        if(key.equals(tag)){
         return map.get(key);
        }
        System.out.println("Name=" + key);
        System.out.println("Value=" + map.get(key));
    }
    return "";
}

2) এবং উরি ক্লাস ব্যবহার করে এটি করার সবচেয়ে সহজ উপায় :

public static String getQueryString(String url, String tag) {
    try {
        Uri uri=Uri.parse(url);
        return uri.getQueryParameter(tag);
    }catch(Exception e){
        Log.e(TAG,"getQueryString() " + e.getMessage());
    }
    return "";
}

এবং এটি দুটি পদ্ধতির যে কোনওটি কীভাবে ব্যবহার করতে হয় তার একটি উদাহরণ:

String url = "http://www.jorgesys.com/advertisements/publicidadmobile.htm?position=x46&site=reform&awidth=800&aheight=120";      
String tagValue = getQueryString(url,"awidth");

ট্যাগভ্যালুয়ের মান 800


3

Android এর উপর, আপনি Uri.parse স্ট্যাটিক পদ্ধতি ব্যবহার করতে পারেন android.net.Uri ভারী উত্তোলন করতে বর্গ। আপনি যদি ইউআরআই এবং ইনটেন্টের সাথে কিছু করে থাকেন তবে আপনি এটি যেভাবেই ব্যবহার করতে চাইবেন।


3

কেবল রেফারেন্সের জন্য, এটিই আমি শেষ করেছি (ইউআরএলসিএনকোডেড ইউটিলের উপর ভিত্তি করে, এবং একটি মানচিত্র ফেরত)।

বৈশিষ্ট্য:

  • এটি ইউআরএলটির ক্যোরিয় স্ট্রিং অংশ গ্রহণ করে (আপনি ব্যবহার করতে পারেন request.getQueryString())
  • একটি খালি ক্যোয়ারী স্ট্রিং একটি খালি উত্পাদন করবে Map
  • মান (? পরীক্ষা) ছাড়াই একটি প্যারামিটার খালি ম্যাপ করা হবে List<String>

কোড:

public static Map<String, List<String>> getParameterMapOfLists(String queryString) {
    Map<String, List<String>> mapOfLists = new HashMap<String, List<String>>();
    if (queryString == null || queryString.length() == 0) {
        return mapOfLists;
    }
    List<NameValuePair> list = URLEncodedUtils.parse(URI.create("http://localhost/?" + queryString), "UTF-8");
    for (NameValuePair pair : list) {
        List<String> values = mapOfLists.get(pair.getName());
        if (values == null) {
            values = new ArrayList<String>();
            mapOfLists.put(pair.getName(), values);
        }
        if (pair.getValue() != null) {
            values.add(pair.getValue());
        }
    }

    return mapOfLists;
}

একটি সামঞ্জস্য সাহায্যকারী (মান শুধু হিসাবে একটি স্ট্রিং অ্যারের মধ্যে সংরক্ষণ করা হয় ServletRequest.getParameterMap () ):

public static Map<String, String[]> getParameterMap(String queryString) {
    Map<String, List<String>> mapOfLists = getParameterMapOfLists(queryString);

    Map<String, String[]> mapOfArrays = new HashMap<String, String[]>();
    for (String key : mapOfLists.keySet()) {
        mapOfArrays.put(key, mapOfLists.get(key).toArray(new String[] {}));
    }

    return mapOfArrays;
}

3

এটি আমার পক্ষে কাজ করে .. আমি নিশ্চিত নই যে প্রত্যেকে কেন মানচিত্রের পরে, তালিকা> আমার যা দরকার তা হল একটি সাধারণ নাম মানচিত্র।

জিনিসগুলি সহজ রাখার জন্য আমি বিল্ডটি ইউআরআই.জিটকিউয়ারি () এ ব্যবহার করেছিলাম;

public static Map<String, String> getUrlParameters(URI uri)
    throws UnsupportedEncodingException {
    Map<String, String> params = new HashMap<String, String>();
    for (String param : uri.getQuery().split("&")) {
        String pair[] = param.split("=");
        String key = URLDecoder.decode(pair[0], "UTF-8");
        String value = "";
        if (pair.length > 1) {
            value = URLDecoder.decode(pair[1], "UTF-8");
        }
        params.put(new String(key), new String(value));
    }
    return params;
}

1
একাধিক নির্বাচন সহ ফর্মগুলি সম্পর্কে কীভাবে? বৈধ ক্যোয়ারী স্ট্রিংগুলিতে কী কীগুলি পুনরাবৃত্তি হওয়া (এবং পোষ্ট ফর্ম সংস্থাগুলি) একেবারে স্বাভাবিক। অন্যান্য ত্রুটি রয়েছে এবং কোণে-কেসগুলি আচ্ছাদিত নয়; তাদের অনেকগুলি অন্যান্য পদ্ধতির ভাষ্যটিতে উল্লেখ করা হয়েছে। আমি ফর্ম বিরত করব ভয়ে তাদের যে ইশারা আপনি এটা ঠিক পরিবর্তে আমার প্রতি একটি মানের গ্রন্থাগার ব্যবহার করে, যেমন গলাবাজি ); প্রশ্নে
উইল

2

এর জন্য পেয়ারার মাল্টিম্যাপ আরও উপযুক্ত। এখানে একটি সংক্ষিপ্ত পরিচ্ছন্ন সংস্করণ:

Multimap<String, String> getUrlParameters(String url) {
        try {
            Multimap<String, String> ret = ArrayListMultimap.create();
            for (NameValuePair param : URLEncodedUtils.parse(new URI(url), "UTF-8")) {
                ret.put(param.getName(), param.getValue());
            }
            return ret;
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }

1

অ্যাপাচি অ্যাক্সআইএস 2-এ কোয়েরিস্ট্রিং পার্সার.জভা একটি স্ব-অন্তর্ভুক্ত প্রয়োগ রয়েছে। আপনি যদি এক্সিস 2 ব্যবহার না করে থাকেন তবে এখান থেকে কেবল উত্সকোড এবং পরীক্ষার কেসটি ডাউনলোড করুন -

http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/transport/http/util/QueryStringParser.java

http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/transport/http/util/QueryStringParserTest.java


1

মূলত এখানে উত্তর

Android এর উপর, সেখানে প্যাকেজের মধ্যে উরি ক্লাস হয় android.net । নোট করুন যে উরিটি android.net এর অংশ, অন্যদিকে ইউআরআই java.net এর অংশ।

উরি ক্লাসে ক্যোরির কী-মান জোড়াটি বের করার জন্য অনেকগুলি ফাংশন রয়েছে। এখানে চিত্র বর্ণনা লিখুন

নিম্নলিখিত ফাংশনটি হ্যাশম্যাপ আকারে মূল-মান জোড়া দেয়।

জাভাতে:

Map<String, String> getQueryKeyValueMap(Uri uri){
    HashMap<String, String> keyValueMap = new HashMap();
    String key;
    String value;

    Set<String> keyNamesList = uri.getQueryParameterNames();
    Iterator iterator = keyNamesList.iterator();

    while (iterator.hasNext()){
        key = (String) iterator.next();
        value = uri.getQueryParameter(key);
        keyValueMap.put(key, value);
    }
    return keyValueMap;
}

কোটলিনে:

fun getQueryKeyValueMap(uri: Uri): HashMap<String, String> {
        val keyValueMap = HashMap<String, String>()
        var key: String
        var value: String

        val keyNamesList = uri.queryParameterNames
        val iterator = keyNamesList.iterator()

        while (iterator.hasNext()) {
            key = iterator.next() as String
            value = uri.getQueryParameter(key) as String
            keyValueMap.put(key, value)
        }
        return keyValueMap
    }

0

আমি মনে করি না জেআরই তে একটি আছে। আপনি অন্যান্য প্যাকেজগুলিতে যেমন অ্যাপাচি এইচটিটিপিপ্লায়েন্টে অনুরূপ ফাংশনগুলি পেতে পারেন। আপনি যদি অন্য কোনও প্যাকেজ ব্যবহার না করেন তবে আপনাকে কেবল নিজের লিখতে হবে। এটা খুব কঠিন নয়। এখানে আমি ব্যবহার করি,

public class QueryString {

 private Map<String, List<String>> parameters;

 public QueryString(String qs) {
  parameters = new TreeMap<String, List<String>>();

  // Parse query string
     String pairs[] = qs.split("&");
     for (String pair : pairs) {
            String name;
            String value;
            int pos = pair.indexOf('=');
            // for "n=", the value is "", for "n", the value is null
         if (pos == -1) {
          name = pair;
          value = null;
         } else {
       try {
        name = URLDecoder.decode(pair.substring(0, pos), "UTF-8");
              value = URLDecoder.decode(pair.substring(pos+1, pair.length()), "UTF-8");            
       } catch (UnsupportedEncodingException e) {
        // Not really possible, throw unchecked
           throw new IllegalStateException("No UTF-8");
       }
         }
         List<String> list = parameters.get(name);
         if (list == null) {
          list = new ArrayList<String>();
          parameters.put(name, list);
         }
         list.add(value);
     }
 }

 public String getParameter(String name) {        
  List<String> values = parameters.get(name);
  if (values == null)
   return null;

  if (values.size() == 0)
   return "";

  return values.get(0);
 }

 public String[] getParameterValues(String name) {        
  List<String> values = parameters.get(name);
  if (values == null)
   return null;

  return (String[])values.toArray(new String[values.size()]);
 }

 public Enumeration<String> getParameterNames() {  
  return Collections.enumeration(parameters.keySet()); 
 }

 public Map<String, String[]> getParameterMap() {
  Map<String, String[]> map = new TreeMap<String, String[]>();
  for (Map.Entry<String, List<String>> entry : parameters.entrySet()) {
   List<String> list = entry.getValue();
   String[] values;
   if (list == null)
    values = null;
   else
    values = (String[]) list.toArray(new String[list.size()]);
   map.put(entry.getKey(), values);
  }
  return map;
 } 
}

অ্যাপাচি ক্লাস গুলোর সাথে উপায় কী?
উইল

1
আপনি পার্স () পদ্ধতিটি ব্যবহার করতে পারেন: hc.apache.org/httpcomponents-client/httpclient/apidocs/org/…
জেডজেড কোডার

3
দয়া করে অ্যাপাচি কমন্স লিঙ্কটি তার নিজের উত্তরে রাখুন যাতে আমি এটিতে ভোট দিতে পারি।
itadok

0

বালুসকের উত্তরের ভিত্তিতে আমি কয়েকটি উদাহরণ লিখেছি-জাভা-কোড:

    if (queryString != null)
    {
        final String[] arrParameters = queryString.split("&");
        for (final String tempParameterString : arrParameters)
        {
            final String[] arrTempParameter = tempParameterString.split("=");
            if (arrTempParameter.length >= 2)
            {
                final String parameterKey = arrTempParameter[0];
                final String parameterValue = arrTempParameter[1];
                //do something with the parameters
            }
        }
    }

0
public static Map <String, String> parseQueryString (final URL url)
        throws UnsupportedEncodingException
{
    final Map <String, String> qps = new TreeMap <String, String> ();
    final StringTokenizer pairs = new StringTokenizer (url.getQuery (), "&");
    while (pairs.hasMoreTokens ())
    {
        final String pair = pairs.nextToken ();
        final StringTokenizer parts = new StringTokenizer (pair, "=");
        final String name = URLDecoder.decode (parts.nextToken (), "ISO-8859-1");
        final String value = URLDecoder.decode (parts.nextToken (), "ISO-8859-1");
        qps.put (name, value);
    }
    return qps;
}

0

অ্যাপাচি এইচটিটিপি কম্পোনেন্টগুলি ব্যবহার করুন এবং মান দ্বারা প্যারামগুলি অ্যাক্সেসের জন্য কিছু সংগ্রহের কোডটি দিয়ে তারটি আপ করুন : -চাবি/


0

পেয়ারা ব্যবহার:

Multimap<String,String> parseQueryString(String queryString, String encoding) {
    LinkedListMultimap<String, String> result = LinkedListMultimap.create();

    for(String entry : Splitter.on("&").omitEmptyStrings().split(queryString)) {
        String pair [] = entry.split("=", 2);
        try {
            result.put(URLDecoder.decode(pair[0], encoding), pair.length == 2 ? URLDecoder.decode(pair[1], encoding) : null);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

    return result;
}

0

এখানে উত্তর দেওয়া কারণ এটি একটি জনপ্রিয় থ্রেড। এটি কোটলিনের একটি পরিষ্কার সমাধান যা প্রস্তাবিত UrlQuerySanitizerএপিআই ব্যবহার করে । সরকারী ডকুমেন্টেশন দেখুন । আমি প্যারামগুলি একত্রিত করতে এবং প্রদর্শন করতে একটি স্ট্রিং বিল্ডার যুক্ত করেছি।

    var myURL: String? = null
    // if the url is sent from a different activity where you set it to a value
    if (intent.hasExtra("my_value")) {
        myURL = intent.extras.getString("my_value")
    } else {
        myURL = intent.dataString
    }

    val sanitizer = UrlQuerySanitizer(myURL)
    // We don't want to manually define every expected query *key*, so we set this to true
    sanitizer.allowUnregisteredParamaters = true
    val parameterNamesToValues: List<UrlQuerySanitizer.ParameterValuePair> = sanitizer.parameterList
    val parameterIterator: Iterator<UrlQuerySanitizer.ParameterValuePair> = parameterNamesToValues.iterator()

    // Helper simply so we can display all values on screen
    val stringBuilder = StringBuilder()

    while (parameterIterator.hasNext()) {
        val parameterValuePair: UrlQuerySanitizer.ParameterValuePair = parameterIterator.next()
        val parameterName: String = parameterValuePair.mParameter
        val parameterValue: String = parameterValuePair.mValue

        // Append string to display all key value pairs
        stringBuilder.append("Key: $parameterName\nValue: $parameterValue\n\n")
    }

    // Set a textView's text to display the string
    val paramListString = stringBuilder.toString()
    val textView: TextView = findViewById(R.id.activity_title) as TextView
    textView.text = "Paramlist is \n\n$paramListString"

    // to check if the url has specific keys
    if (sanitizer.hasParameter("type")) {
        val type = sanitizer.getValue("type")
        println("sanitizer has type param $type")
    }

-2

এই পদ্ধতিটি ইউরি এবং পারের নাম এবং সমমূল্যের মানের রিটার্ন নেয়

  public static Map<String, String> getQueryMap(String uri) {

    String queryParms[] = uri.split("\\?");

    Map<String, String> map = new HashMap<>();// 

    if (queryParms == null || queryParms.length == 0) return map;

    String[] params = queryParms[1].split("&");
    for (String param : params) {
        String name = param.split("=")[0];
        String value = param.split("=")[1];
        map.put(name, value);
    }
    return map;
}

1
উপরের আমার রেন্ট অনুসারে, এটিকে তুচ্ছভাবে ক্র্যাশ করতে পারে। ফিক্সিংয়ে বিরক্ত করবেন না, কেবল পরিবর্তে একটি পেশাদার ইউটিলিটি লাইব্রেরি ব্যবহার করুন।
উইল

-3

আপনি "জাভা" বলছেন তবে "জাভা ইই নয়"। আপনি কী JSP এবং / অথবা সার্লেটগুলি ব্যবহার করছেন তবে পুরো জাভা EE স্ট্যাকটি ব্যবহার করছেন না তার অর্থ? যদি এটি হয় তবে আপনার কাছে এখনও অনুরোধ থাকা উচিত get বিটপ্যারামিটার () আপনার কাছে উপলব্ধ।

যদি আপনি বোঝাচ্ছেন যে আপনি জাভা লিখছেন তবে আপনি জেএসপি বা সার্ফলেট লিখছেন না, বা আপনি কেবল জাভাটি আপনার রেফারেন্স পয়েন্ট হিসাবে ব্যবহার করছেন তবে আপনি এমন কিছু প্ল্যাটফর্মের মধ্যে রয়েছেন যা অন্তর্নির্মিত প্যারামিটার পার্সিং নেই ... বাহ! , এটি কেবল একটি অসম্ভব প্রশ্নের মতো মনে হচ্ছে, তবে যদি তা হয় তবে নীতিটি হ'ল:

xparm=0
word=""
loop
  get next char
  if no char
    exit loop
  if char=='='
    param_name[xparm]=word
    word=""
  else if char=='&'
    param_value[xparm]=word
    word=""
    xparm=xparm+1
  else if char=='%'
    read next two chars
    word=word+interpret the chars as hex digits to make a byte
  else
    word=word+char

(আমি জাভা কোড লিখতে পারতাম তবে তা অর্থহীন হবে, কারণ আপনার জাভা উপলব্ধ থাকলে আপনি কেবল অনুরোধ.জেটপ্যারামিটার ব্যবহার করতে পারেন))


হেক্স ডিজিটগুলি ইউআরএল-ডিকোড করার সময় অক্ষর এনকোডিংয়ের জন্য নজর রাখুন।
মিঃ শাইনি এবং নিউ 宇 宇

এটি অ্যান্ড্রয়েড, তাই জাভা কিন্তু জে 2 ইই নয়।
আন্দ্রেজেজ ডয়েল

আমি উল্লেখ করতে ভুলে গেছি: আপনার "+" যাচাই করা দরকার যা কোনও জায়গায় অনুবাদ করা উচিত। এম্বেড থাকা স্পেসগুলি কোনও ক্যোয়ারী স্ট্রিংয়ে অবৈধ।
জে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.