Как передать массив JSON в качестве параметра в URL-адресе

У меня есть требование передать некоторые значения с мобильного на сервер в вызове веб-службы, поэтому я планирую передать все значения в формате 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

Может ли любой орган рассказать мне, почему я не получаю все значения, пожалуйста?

Ответ 1

Я бы предложил передавать данные JSON в теле как запрос POST. Но если вы все еще хотите передать это как параметр в URL, вам придется кодировать свой URL, как показано ниже, например: -

для бывшего 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

Ответ 2

Я знаю, что это может быть более поздний пост, но для новых посетителей я поделюсь своим решением, так как OP просил способ передать объект JSON через GET (не POST, как было предложено в других ответах).

  1. Возьмите объект JSON и преобразуйте его в строку (JSON.stringify)
  2. Возьмите строку и закодируйте ее в Base64 (вы можете найти полезную информацию об этом здесь
  3. Добавьте его в URL-адрес и сделайте вызов GET
  4. Обратный процесс. декодировать и анализировать его в объект

Я использовал это в некоторых случаях, когда я только могу делать вызовы GET, и это работает. Кроме того, это решение является практически перекрестным.

Ответ 3

& Амп; это ключевое слово для следующего параметра, как это Ур param1 = 1 & амп;? param2 = 2

так эффективно вы посылаете второй параметр с именем R ". Вы должны urlencode свою строку. Разве POST не является опцией?

Ответ 4

Вы можете передать свой json-вход как запрос 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:[email protected]";
            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

Ответ 5

Я знаю, что это старо, но если кто-то еще хочет знать, почему они получают неполный json, как описано выше, это потому, что амперсанд & - это специальный символ в URL, используемый для разделения параметров.
В ваших данных есть амперсанд в R&R. Таким образом, параметр acc заканчивается, когда он достигает символа амперсанда.

Вот почему вы получаете рубленые данные. Решением является либо URL-кодирование данных, либо отправка в формате POST, как предполагает принятое решение.

Ответ 6

Поскольку @RE350 предположил, что передача данных JSON в теле в сообщении будет идеальной. Тем не менее, вы все равно можете отправить объект json в качестве параметра в запросе GET, декодировать строку json в логике на стороне сервера и использовать его как объект.

Например, если вы находитесь на php, вы можете это сделать (используйте соответствующий json-декодирование на других языках):

Запрос сервера:

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

На сервере:

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

вывод:

89

Ответ 7

Отправьте строку данных Json на веб-адрес и получите результат с сообщением метода

в С#

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

?>

Ответ 8

Я знаю, что это может быть более поздняя публикация, но для новых посетителей я поделюсь своим решением, так как OP запрашивал способ передачи объекта JSON через GET (не POST, как предлагалось в других ответах)

1. Объект JSON и преобразовать его в строку (JSON.stringify)  2. Строка и закодируйте ее в Base64 (здесь вы можете найти некоторую полезную информацию

  1. Добавьте его к URL и сделайте вызов GET Обратный процесс. расшифровать и разобрать его в объект