web-dev-qa-db-fra.com

Comment passer un tableau JSON en tant que paramètre dans une URL

J'ai besoin de transmettre certaines valeurs de mobile à serveur dans un appel de service Web et je prévois donc de transmettre toutes les valeurs au format JSON, comme ci-dessous.

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

Ce qui suit est mon appel de service

@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();
}

J'essaie d'appeler le service ci-dessus de cette façon

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

Mais la sortie est comme ça

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

Quelqu'un peut-il me dire, s'il vous plaît, pourquoi je ne reçois pas toutes les valeurs, s'il vous plaît?

16
rocking

Je suggérerais de transmettre les données JSON dans le corps sous la forme d'une requête POST.Mais si vous souhaitez toujours le transmettre en tant que paramètre dans une URL, vous devrez encoder votre URL comme ci-dessous, par exemple:

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

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

pour plus d'informations sur le codage d'URL, voir ci-dessous

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

32
RE350

Je sais que cela pourrait être un post ultérieur, mais, pour les nouveaux visiteurs, je partagerai ma solution car le PO demandait un moyen de transmettre un objet JSON via GET (et non POST comme suggéré dans d'autres réponses). .

  1. Prenez l'objet JSON et convertissez-le en chaîne (JSON.stringify)
  2. Prenez la chaîne et encodez-la en Base64 (vous pouvez trouver des informations utiles sur ceci ici
  3. Ajoutez-le à l'URL et passez l'appel GET
  4. Inverser le processus. décoder et analyser dans un objet

J'ai utilisé cela dans certains cas où je ne peux faire que des appels GET et cela fonctionne. En outre, cette solution est pratiquement multilingue.

10
gvelasquez85

& est un mot clé pour le paramètre suivant, comme celui-ci ur? param1 = 1 & param2 = 2

si bien que vous envoyez un deuxième paramètre nommé R ". Vous devriez urlencoder votre chaîne. N’est-ce pas POST une option?

3
wgitscht

Vous pouvez transmettre votre entrée json sous forme de demande POST avec l'en-tête d'autorisation de cette manière.

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;


    }

Cette méthode renverra une réponse json. De la même manière, vous pouvez utiliser la méthode GET

2
pintu

Comme @ RE350 a suggéré de transmettre les données JSON dans le corps de la publication serait idéal. Cependant, vous pouvez toujours envoyer l'objet JSON en tant que paramètre dans une requête GET, décoder la chaîne JSON dans la logique côté serveur et l'utiliser comme objet. 

Par exemple, si vous êtes sur php, vous pouvez le faire (utilisez le décodage json approprié dans d'autres langues):

Demande du serveur:

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

Sur le serveur:

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

out mis:

89
0
picmate 涅

Envoyez une chaîne de données Json à une adresse Web et obtenez un résultat avec la méthode post

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

en PHP

<?php

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

?>
0
Anaramer