Как передать массив 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, как было предложено в других ответах).
- Возьмите объект JSON и преобразуйте его в строку (JSON.stringify)
- Возьмите строку и закодируйте ее в Base64 (вы можете найти полезную информацию об этом здесь
- Добавьте его в URL-адрес и сделайте вызов GET
- Обратный процесс. декодировать и анализировать его в объект
Я использовал это в некоторых случаях, когда я только могу делать вызовы 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 (здесь вы можете найти некоторую полезную информацию
- Добавьте его к URL и сделайте вызов GET
Обратный процесс. расшифровать и разобрать его в объект