Androidでのクエリ文字列の解析


271

Java EEにはServletRequest.getParameterValues()があります。

非EEプラットフォームでは、URL.getQuery()は単に文字列を返します。

Java EEを使用していない場合に、URLのクエリ文字列を適切に解析する通常の方法は何ですか?


< 暴言 >

自分のパーサーを作ってみようという答えが人気です。これは非常に興味深いエキサイティングなマイクロコーディングプロジェクトですが、良いアイデアだとは言えません :(

以下のコードスニペットは、一般的に欠陥があるか壊れています。それらを壊すことは読者にとって興味深い練習です。 そして、それらを使用するWebサイトを攻撃するハッカーに

クエリ文字列の解析は明確に定義された問題ですが、仕様を読んでニュアンスを理解することは簡単ではありません。あなたのために、いくつかのプラットフォームライブラリコーダーにハードワークをさせ、修正を行わせるほうがはるかに良いです!

< /暴言 >


サンプルURLを投稿してもらえますか、何から取得していてgetQuery()、何を出力として取得したいですか?
Thomas Owens、

1
サーブレットまたはJSPページからこれを実行しますか?回答する前に説明が必要です。
ChadNC 2009年

1
POSTパラメータも解析する必要がありますか?
ティロ

2
J2EE(または私のように、選択したEEパッケージがOSGi経由で追加されたSE)を使用している場合でも、この質問は理にかなっています。私の場合、クエリ文字列/ URLエンコードされたPOSTボディは、意図的にに依存しないシステムの一部によって処理されServletRequestます。
Hanno Fietz、

61
<rant />に賛成!
Nowaker、2011

回答:


65

Android M以降、物事はより複雑になりました。android.net.URI .getQueryParameter()の回答には、JellyBeanの前のスペースが壊れるバグがあります。 Apache URLEncodedUtils.parse()は機能しましたが、Lでは廃止され、Mでは削除されました

したがって、現時点で最良の答えはUrlQuerySanitizerです。これはAPIレベル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.getAllButNullLegal()は、UrlQuerySanitizerではなくUrlQuerySanitizer.ValueSanitizerを返します。
Peter Zhao

31
上記は私のために動作しませんでした何らかの理由で、私は少しそれを変更しなければならなかった-それも容易になりた:UrlQuerySanitizer sanitizer = new UrlQuerySanitizer(YourStringURL); String value = sanitizer.getValue("parameter");
SeBsZ

3
うまくいかない。UrlQuerySanitizer sdk-23では、メソッドは1つだけですsanitize()
Ninja

これにより、特殊文字と絵文字がにデコードされ_ます。私はstackoverflow.com/a/35638979/1155282に参加
Irshu

これのSpringフレームワークに相当するライブラリはありますか?
iamjoshua

202

Androidの場合:

import android.net.Uri;

[...]

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

20
これはURIクラスではなくUriクラスを使用することに注意してください(Uriはandroid.netの一部ですが、URIはjava.netの一部です)
Marius

5
また、アイスクリームサンドイッチの前は、値の+文字をスペース文字に解析できないことに注意してください。
rpetrich

@rpetrichは実際には、バグはJelly Beanの前であり、Ice Cream Sandwichを含むとドキュメントは言っています。ref
Big McLargeHuge

64

9
これは、Androidだけでなく、Apache httpクライアントライブラリでも利用できます。ところで、apacheへのリンクが変更されました。最新です:hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/...
クリスティアンVrabie

9
迷惑なことにをURLEncodedUtils.parse()返し、List特定のキーの値を見つけるためにループする必要があります。MapBalusCの答えでlikeを返したほうがずっといいでしょう。
Asaph 2011

1
@Hanno Fietzあなたはこれらの選択肢を信頼しているということですか?私は彼らがバギーであることを知っています。私が見たバグを指摘することは、私が見落としたバグを探すのではなく、「修正された」バージョンを採用することを人々に奨励するだけであることを知っています。
ウィル

1
@まあ-まあ、私は私がどんなウェブサイトから得たコピーアンドペーストのスニペットだけを信頼することは決してないだろうし、誰もそうすべきではない。しかし、ここでは、これらのスニペットはかなりよくレビューされ、コメントされているためare、実際には非常に役立ちます。コードの何が悪いのかについての提案を単に見ているだけでも、私自身の考えにおいてすでに大きな助けになっています。心に留めておきたいのは、「自分でロールする方が良い」と言うつもりはなかったのですが、自分のコードで十分な情報を得た上で決定を下すための優れた資料があるということです。
Hanno Fietz、

8
parseがリストを返すことで、位置の順序が維持され、重複したエントリがより簡単に許可されると思います。
dhaag23 '10 / 10/27

26

これがBalusCの答えですが、コンパイルして結果を返します。

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
JVM注:Javaコレクションを使用して、これと同等の形式をScalaに実装しました。こちらがgithub gist
Jay Taylor

2
に変更String pair[] = param.split("=");String pair[] = param.split("=", 2);て、key = valueペアを最初の発生時にのみ分割することをお勧めします。値にエンコードされていない等号を含めることが許可されていると思います。
デニー2013

22

クラスパスにjetty(サーバーまたはクライアント)ライブラリがある場合は、jetty utilクラス(javadocを参照)を使用できます。例:

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

Spring 3.1以降を使用している場合(そう、サポートがさらに戻ることを期待していました)、UriComponentsand を使用できますUriComponentsBuilder

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

components.getQueryParams() を返す MultiValueMap<String, String>

ここにいくつかのドキュメントがあります


これは私が探しているものです。私の質問は、URIを取得する方法ですか?あまり変更できないコードのメンテナンスに行き詰まっており、HttpServletを使用していません。代わりに、注釈とSpring(@ Get、@ Produces(mediaType)および@Path( "/ dataAsJSON / datafield / {datafield}))を使用するだけです。この例
Nelda.techspiress 2016年

5

サーブレットまたはJSPページの場合、request.getParameter( "paramname")を使用してクエリ文字列のキーと値のペアを取得できます

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

他の方法もありますが、私が作成するすべてのサーブレットとjspページでそれを行う方法です。


3
HttpServletRequestは彼が持っていないJ2EEの一部です。また、getParamter()を使用しても、実際には解析されません。
Shiny and New安宇

3
私が彼の質問の明確化を求めたコメントを読む時間をとってください。この回答は、彼が述べたコメントへの彼の回答に対するものです。質問)だから遠慮せずに!」私はそのコメントに基づいて彼の質問に答えました。追加するものがない場合は、何も追加しないでください
ChadNC、2009年

1
動揺してはいけません。「これは質問に答えません」は、IMOを追加するのに役立ちます。
Shiny and New安宇

1
Androidかどうかは関係ありません。問題は、URLを含む文字列を解析し、URLパラメータを取得する方法です。ここで移植するのはサーブレットAPIの一部であり、サーブレットコンテナはHTTPリクエストからの受信パラメータを解析します。問題は、HTTPリクエストではなく、サーブレットコンテナ内ではなく、URLを含む文字列の解析に関するものであるため、無関係です。
mvmn

5

Androidでは、私は@diyismの答えを使用してみましたが、私は、例えば@rpetrichが提起した空白文字の問題を、発生しました:私はどこのフォームに記入username = "us+us"してpassword = "pw pw"見えるようにURL文字列を引き起こしました:

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

しかし、@diyismコードが戻る"us+us"とは"pw+pw"、それがスペース文字を検出しませんすなわち。URLが%20スペース文字で書き換えられた場合は、次のように識別されます。

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

これにより、次の修正が行われます。

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

replace(" ", "%20")これは間違っていると感じます。しかし、私のためのトリックをした:D
マルティンスBriedis

正しい構文は "some string"です。replaceAll( "[+]"、 "%20");
RRTW 2013年

4

クエリ文字列の解析は、許容度に応じて、見た目よりも少し複雑です。

まず、クエリ文字列はASCIIバイトです。これらのバイトを一度に1つずつ読み取り、それらを文字に変換します。キャラクターが?または&次に、パラメーター名の開始を通知します。文字が=の場合、パラメーター値の開始を示します。文字が%の場合、エンコードされたバイトの開始を示します。ここがトリッキーになるところです。

%charを読み取るときは、次の2バイトを読み取って、それらを16進数字として解釈する必要があります。つまり、次の2バイトは0-9、af、またはAFになります。これらの2つの16進数を一緒に接着して、バイト値を取得します。ただし、バイトは文字ではありません。文字のエンコードに使用されたエンコードを知っている必要があります。文字éは、ISO-8859-1と同じようにUTF-8でエンコードしません。一般に、特定の文字セットに使用されているエンコーディングを知ることは不可能です。私のWebサイトは常にUTF-8を使用してすべてを提供するように構成されているため、私は常にUTF-8を使用していますが、実際には確実ではありません。一部のユーザーエージェントは、リクエストの文字エンコードを通知します。完全なHTTPリクエストがある場合は、それを読むことができます。あなただけのURLがある場合は、頑張ってください。

とにかく、UTF-8またはその他のマルチバイト文字エンコーディングを使用していると仮定すると、1つのエンコードされたバイトをデコードしたので、次のバイトをキャプチャするまで脇に置いておく必要があります。一度に1バイトずつ正しくURLデコードできないため、すべてのエンコードされたバイトが一緒に必要になります。一緒になっているすべてのバイトを脇に置き、一度にすべてをデコードしてキャラクターを再構築します。

さらに、寛大になり、URLを壊すユーザーエージェントを考慮したい場合は、さらに楽しくなります。たとえば、一部のWebメールクライアントは、物事をダブルエンコードします。または、?&=文字を2倍にします(例:) http://yoursite.com/blah??p1==v1&&p2==v2。これを適切に処理したい場合は、パーサーにロジックを追加する必要があります。


これは、クエリ文字列パラメーター値を解析または取得する方法を説明していません
ChadNC

そうですが、少し面倒です。そのために、すでにURLDecoderがあります。
BalusC 2009年

2
@ChadNC:3番目の文は、解析方法を示します。一度に1バイトずつ読み取り、文字に変換します。4番目の文は、特殊文字を警告します。たぶんあなたは答えを読んでいないのですか?
Shiny and New安宇

@BalusC:URLDecoderは機能しますが、どのような種類のURLを受け入れるかをより厳格にしようとする場合、いくつかの失敗モードがあります。
Shiny and New安宇

1
@ Mr.ShinyAndNewの解析クエリパラメータに同意するのは簡単ではありません。私はFIQLをサポートしていますが、これはお尻の痛みになります。例:yoursite.com/blah
??p1==v1&&p2==v2,p2==v3;p2==v4

4

Androidでは、以下のコードのように単純です。

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)Uriクラスを使用してこれを行う最も簡単な方法:

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 "";
}

これは、次の2つの方法のいずれかを使用する方法の例です。

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

tagValueの値は 800



3

参考までに、これは(URLEncodedUtilsに基づいており、マップを返す)結局のところです。

特徴:

  • URLのクエリ文字列部分を受け入れます(使用できますrequest.getQueryString()
  • 空のクエリ文字列は空を生成します Map
  • 値のないパラメーター(?test)は空にマップされます 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

これは私にとってはうまくいきます。なぜすべてがMapの後だったのかはわかりません。List>必要なのは単純な名前の値Mapだけでした。

物事をシンプルに保つために、URI.getQuery();でビルドを使用しました。

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
複数選択のフォームはどうですか?正規のクエリ文字列(およびPOSTフォームボディ)でキーが繰り返されるのはまったく正常です。カバーされていない他の欠陥やコーナーケースがあります。それらの多くは、他のアプローチの解説で言及されています。質問の私の怒りのように、質の高いライブラリを使用する代わりに修正するのではないかと恐れて彼らを指摘することは控えます;)
Will

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

Apache AXIS2には、QueryStringParser.javaの自己完結型の実装があります。Axis2を使用していない場合は、ここからソースコードとテストケースをダウンロードしてください-

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に Uriクラスがあります。Uriはandroid.netの一部であり、URIはjava.netの一部であることに注意してください。

Uriクラスには、クエリのキーと値のペアを抽出するための多くの関数があります。 ここに画像の説明を入力してください

次の関数は、キーと値のペアをHashMapの形式で返します。

Javaの場合:

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

JREにはありません。Apache HttpClientのような他のパッケージでも同様の機能を見つけることができます。他のパッケージを使用しない場合は、独自のパッケージを作成する必要があります。それほど難しいことではありません。これが私が使うものです、

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

Apacheクラスの方法は何ですか?
ウィル

1
parse()メソッドを使用できます。hc.apache.org
ZZ Coder

3
私が投票できるように、Apache commonsリンクを独自の回答に含めてください。
itsadok 2009年

0

BalusCからの回答に基づいて、いくつかのサンプルJavaコードを記述しました。

    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

Guavaの使用:

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

これは人気のスレッドなので、ここで答えます。これは、推奨されるUrlQuerySanitizerAPI を使用するKotlinのクリーンなソリューションです。公式ドキュメントを参照してください。文字列ビルダーを追加して、パラメーターを連結して表示します。

    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

このメソッドはURIを取り、パー名とパー値のマップを返します

  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

あなたは「Java」と言いますが「Java EE」ではありません。完全なJava EEスタックではなく、JSPやサーブレットを使用しているということですか?その場合でも、request.getParameter()を使用できるはずです。

Javaを作成しているが、JSPもサーブレットも作成していない、またはJavaを参照ポイントとして使用しているが、パラメーターの解析が組み込まれていない他のプラットフォームを使用している場合... Wow 、それはありそうもない質問のように聞こえますが、もしそうなら、原則は次のようになります:

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

(Javaコードを作成することもできますが、Javaを使用できる場合は、request.getParametersを使用するだけなので、それは無意味です。)


16進数をURLデコードするときは、文字エンコードに注意してください。
Shiny and New安宇

これはAndroidなので、JavaですがJ2EEではありません。
Andrzej Doyle

言及するのを忘れていました。「+」も確認する必要があります。これはスペースに変換する必要があります。埋め込み文字列はクエリ文字列では無効です。
ジェイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.