web-dev-qa-db-de.com

So übergeben Sie ein JSON-Array als Parameter in der URL

Ich habe die Anforderung, einige Werte von Mobile an Server in einem Web-Service-Aufruf zu übergeben. Daher plane ich, alle Werte im JSON-Format (siehe unten) zu übergeben

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

Das Folgende ist mein Kundendienst

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

Ich versuche, den oben genannten Dienst auf diese Weise anzurufen

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

Aber die Ausgabe ist so

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

Kann mir jemand sagen, warum ich nicht alle Werte bekomme?

16
rocking

Ich würde vorschlagen, die JSON-Daten im Rumpf als POST-Anfrage zu übergeben. Wenn Sie diesen Parameter jedoch weiterhin als Parameter in URL übergeben möchten, müssen Sie Ihre URL wie folgt kodieren, nur zum Beispiel: -

für ex json ist: -> {"name":"ABC","id":"1"}

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

weitere Informationen zur URL-Codierung finden Sie unten

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

32
RE350

Ich weiß, dass dies ein späterer Beitrag sein könnte, aber für neue Besucher werde ich meine Lösung mitteilen, da das OP nach einem Weg gefragt hat, ein JSON-Objekt über GET zu übergeben (nicht POST wie in anderen Antworten vorgeschlagen).

  1. Nehmen Sie das JSON-Objekt und konvertieren Sie es in eine Zeichenfolge (JSON.stringify).
  2. Nehmen Sie den String und kodieren Sie ihn in Base64 (einige nützliche Informationen dazu finden Sie hier hier
  3. Hängen Sie ihn an die URL an und rufen Sie den GET-Aufruf auf
  4. Kehren Sie den Prozess um. dekodieren und in ein Objekt parsen

Ich habe dies in einigen Fällen verwendet, in denen ich nur GET-Aufrufe ausführen kann und es funktioniert. Auch diese Lösung ist praktisch sprachübergreifend.

10
gvelasquez85

& ist ein Schlüsselwort für den nächsten Parameter wie diesem ur? param1 = 1 & param2 = 2

so effektiv senden Sie einen zweiten Parameter mit dem Namen R ". Sie sollten Ihre Zeichenfolge mit einer UML-Codierung versehen. Ist POST keine Option?

3
wgitscht

Auf diese Weise können Sie Ihre json Input als POST - Anforderung zusammen mit dem Berechtigungsheader übergeben

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;


    }

Diese Methode gibt eine Json-Antwort zurück. Auf dieselbe Weise können Sie die GET-Methode verwenden

2
pintu

Wie @ RE350 vorschlug, wäre es ideal, die JSON-Daten im Body im Post zu übergeben. Sie können das json-Objekt jedoch weiterhin als Parameter in einer GET-Anforderung senden, den json-String in der serverseitigen Logik dekodieren und als Objekt verwenden. 

Wenn Sie sich zum Beispiel auf PHP befinden, können Sie dies tun (verwenden Sie die entsprechende Json-Dekodierung in anderen Sprachen):

Serveranfrage:

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

Auf dem Server:

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

ausgabe:

89
0
picmate 涅

Senden Sie den Json-Datenstring an eine Webadresse und erhalten Sie ein Ergebnis mit method post

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

in PHP

<?php

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

?>
0
Anaramer