web-dev-qa-db-ja.com

JSON配列をURLのパラメーターとして渡す方法

Webサービス呼び出しでモバイルからサーバーにいくつかの値を渡す必要があるため、以下のようなJSON形式ですべての値を渡すことを計画しています

{
    "nameservice": [
        {
            "id": 7413,
            "name": "ask"
        },
        {
            "id": 7414,
            "name": "josn"
        },
        {
            "id": 7415,
            "name": "john"
        },
        {
            "id": 7418,
            "name": "R&R"
        }
    ]
}

以下は私のサービスコールです

@RequestMapping("/saveName")
@ResponseBody
public String saveName(String acc)
{jsonObject = new JSONObject();
    try
    {
    );
    System.out.println(acc);
    jsonObject.accumulate("result", "saved ");
    }
    catch(Exception e)
    {
        e.printStackTrace();jsonObject.accumulate("result", "Error Occured ");
    }
    return jsonObject.toString();
}

この方法で上記のサービスを呼び出そうとしています

localhost:8080/service/saveName?acc={ "nameservice": [ { "id": 7413, "name": "ask" }, { "id": 7414, "name": "josn" }, { "id": 7415, "name": "john" }, { "id": 7418, "name": "R&R" } ] }

しかし、出力は次のようになります

{ "nameservice": [ { "id": 7413, "name": "ask" }, { "id": 7414, "name": "josn" }, { "id": 7415, "name": "john" }, { "id": 7418, "name": "R

すべての値を取得できないのはなぜですか?

27
rocking

本文のJSONデータをPOSTリクエストとして渡すことをお勧めします。しかし、これをURLのパラメーターとして渡したい場合は、たとえば以下のようにURLをエンコードする必要があります。

ex jsonは:-> {"name":"ABC","id":"1"}

testurl:80/service?data=%7B%22name%22%3A%22ABC%22%2C%22id%22%3A%221%22%7D

uRLエンコードの詳細については、以下を参照してください

https://en.wikipedia.org/wiki/Percent-encoding

37
RE350

私はこれが後の投稿になる可能性があることを知っていますが、OPがGETを介してJSONオブジェクトを渡す方法を求めていたので(新しい回答では提案されたPOSTではなく) 。

  1. JSONオブジェクトを取得し、文字列に変換します(JSON.stringify)
  2. 文字列を取得し、Base64でエンコードします(これに関する有用な情報を見つけることができます here
  3. URLに追加してGET呼び出しを行います
  4. プロセスを逆にします。オブジェクトにデコードして解析する

これは、GET呼び出ししか実行できない場合に使用しますが、機能します。また、このソリューションは実質的にクロスランゲージです。

21
gvelasquez85

&は、このような次のパラメーターのキーワードですか?param1 = 1&param2 = 2

とても効果的にR "という名前の2番目のパラメーターを送信します。文字列をurlencodeする必要があります。POSTはオプションではありませんか?

3
wgitscht

この方法で、json Inputを認証ヘッダーとともにPOSTリクエストとして渡すことができます

public static JSONObject getHttpConn(String json){
        JSONObject jsonObject=null;
        try {
            HttpPost httpPost=new HttpPost("http://google.com/");
            org.Apache.http.client.HttpClient client = HttpClientBuilder.create().build();
            StringEntity stringEntity=new StringEntity("d="+json);

            httpPost.addHeader("content-type", "application/x-www-form-urlencoded");
            String authorization="test:test@123";
            String encodedAuth = "Basic " + Base64.encode(authorization.getBytes());        
            httpPost.addHeader("Authorization", security.get("Authorization"));
            httpPost.setEntity(stringEntity);
            HttpResponse reponse=client.execute(httpPost);
            InputStream inputStream=reponse.getEntity().getContent();
            String jsonResponse=IOUtils.toString(inputStream);
            jsonObject=JSONObject.fromObject(jsonResponse);
            } catch (UnsupportedEncodingException e) {

            e.printStackTrace();
        } catch (ClientProtocolException e) {

            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        }
        return jsonObject;


    }

このメソッドはJSONレスポンスを返します。同じ方法でGETメソッドを使用できます

3
pintu

@ RE350が提案したように、投稿の本文にJSONデータを渡すことが理想的です。ただし、GET要求のパラメーターとしてjsonオブジェクトを送信し、サーバー側のロジックでjson文字列をデコードし、オブジェクトとして使用することもできます。

たとえば、PHPを使用している場合、これを行うことができます(他の言語で適切なjsonデコードを使用します)。

サーバー要求:

http://<php script>?param1={"nameservice":[{"id":89},{"id":3}]}

サーバー内:

$obj = json_decode($_GET['param1'], true);
$obj["nameservice"][0]["id"]

出力:

89
0
picmate 涅

Jsonデータ文字列をWebアドレスに送信し、メソッドpostで結果を取得します

c#で

public string SendJsonToUrl(string Url, string StrJsonData)
{
    if (Url == "" || StrJsonData == "") return "";
    try
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
        request.Method = "POST";
        request.ContentType = "application/json";
        request.ContentLength = StrJsonData.Length;
        using (var streamWriter = new StreamWriter(request.GetRequestStream()))
        {
            streamWriter.Write(StrJsonData);
            streamWriter.Close();
            var httpResponse = (HttpWebResponse)request.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var result = streamReader.ReadToEnd();
                return result;
            }
        }
    }
    catch (Exception exp)
    {
        throw new Exception("SendJsonToUrl", exp);
    }
}

pHPで

<?php

$input = file_get_contents('php://input');
$json = json_decode($input ,true);

?>
0
Anaramer