web-dev-qa-db-fra.com

Comment POST données dans Android au serveur au format JSON?

J'ai cette chaîne JSON. Je souhaite POST l’afficher sur le serveur (c’est-à-dire à l’aide de la méthode POST). Comment cela peut-il être fait dans Android?

Chaîne JSON:

{
    "clientId": "ID:1234-1234",
    "device": {
        "userAgent": "myUA",
        "capabilities": {
            "sms": true,
            "data": true,
            "gps": true,
            "keyValue": {
                "Key2": "MyValue2",
                "Key1": "myvalue1"
            }
        },
        "screen": {
            "width": 45,
            "height": 32
        },
        "keyValue": {
            "DevcKey2": "myValue2",
            "DevcKey1": "myValue1"
        }
    },
    "time": 1294617435368
}

Comment puis-je former ce tableau JSON et POST au serveur?

17
N-JOY

Je l'ai fait moi-même.

JSONObject returnedJObject= new JSONObject();
JSONObject KeyvalspairJObject=new JSONObject ();
JSONObject devcKeyvalspairJObject=new JSONObject ();
JSONObject capabilityJObject=new JSONObject();
JSONObject ScreenDimensionsJObject =new JSONObject();
JSONObject deviceJObject= new JSONObject();
try{
    KeyvalspairJObject.put("key1","val1");
    KeyvalspairJObject.put("key2","val2");
    capabilityJObject.put("sms", false);
    capabilityJObject.put("data", true);
    capabilityJObject.put("gps", true);
    capabilityJObject.put("wifi", true);
    capabilityJObject.put("keyValue", KeyvalspairJObject);
    ScreenDimensionsJObject.put("width", 45);
    ScreenDimensionsJObject.put("height", 45);
    devcKeyvalspairJObject.put("Devckey1","val1");
    devcKeyvalspairJObject.put("DEVCkey2","val2");
    deviceJObject.put("userAgent", "MYUserAgent");
    deviceJObject.put("capabilities", capabilityJObject);
    deviceJObject.put("screen", ScreenDimensionsJObject);
    deviceJObject.put("keyValue", devcKeyvalspairJObject);

    returnedJObject.put("clientId", "ID:1234-1234");
    returnedJObject.put("carrier","TMobile");
    returnedJObject.put("device",deviceJObject);
    returnedJObject.put("time",1294617435);
    returnedJObject.put("msisdn","1234567890");
    returnedJObject.put("timezone","GMT");
}
catch(JSONException e)
{
}

et c’est ainsi que nous pouvons envoyer des données JSON au serveur.

public String putDataToServer(String url,JSONObject returnedJObject) throws Throwable
{
    HttpPost request = new HttpPost(url);
    JSONStringer json = new JSONStringer();
    StringBuilder sb=new StringBuilder();


    if (returnedJObject!=null) 
    {
        Iterator<String> itKeys = returnedJObject.keys();
        if(itKeys.hasNext())
            json.object();
        while (itKeys.hasNext()) 
        {
            String k=itKeys.next();
            json.key(k).value(returnedJObject.get(k));
            Log.e("keys "+k,"value "+returnedJObject.get(k).toString());
        }             
    }
    json.endObject();


    StringEntity entity = new StringEntity(json.toString());
                         entity.setContentType("application/json;charset=UTF-8");
    entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"application/json;charset=UTF-8"));
    request.setHeader("Accept", "application/json");
    request.setEntity(entity); 

    HttpResponse response =null;
    DefaultHttpClient httpClient = new DefaultHttpClient();

    HttpConnectionParams.setSoTimeout(httpClient.getParams(), Constants.Android_CONNECTION_TIMEOUT*1000); 
    HttpConnectionParams.setConnectionTimeout(httpClient.getParams(),Constants.Android_CONNECTION_TIMEOUT*1000); 
    try{
        response = httpClient.execute(request); 
    }
    catch(SocketException se)
    {
        Log.e("SocketException", se+"");
        throw se;
    }
    InputStream in = response.getEntity().getContent();
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String line = null;
    while((line = reader.readLine()) != null){
        sb.append(line);
    }
    return sb.toString();
}
17
N-JOY

Si vous avez déjà JSON en tant que chaîne, il vous suffit d'utiliser POST à l'aide d'une connexion HTTP classique (URL.openConnection ()). Pas besoin d'analyser ou quelque chose comme ça.

8
StaxMan

Regardez ce code

https://Gist.github.com/9457c486af9644cf6b18

Voir les retrieveJSONArray (ArrayList jsonArray, String [] clé)} et retrieveJSONString (ArrayList jsonObject)}.

1
viv
JSONObject returnedJObject= new JSONObject();

url = "http://49.50.76.75/website/exxx/api.php";

// makeSignupRequest();

try {
    returnedJObject.put("email",eemail);
    returnedJObject.put("password",passwrd);
    returnedJObject.put("type","customer");
    returnedJObject.put("method","register");
    returnedJObject.put("username",usr);

    try {
        putDataToServer(url, returnedJObject);

    }
    catch (Throwable m) {
        m.printStackTrace();
    }
}
1
kaustav Chaudhury

vous pouvez également utiliser Httpurlconnection s'il vous plaît vérifier le lien et vous obtenez plus d'idée. ou Httpsurlconnection

0
Arpan24x7

SI ceci est autre chose qu'une application "Hobby" avec seulement un ou deux appels de service à effectuer, je considérerais une bibliothèque asynchrone HTTP ou REST.

Plusieurs solutions méritent d’être examinées, notamment Volley de Google: https://developer.Android.com/training/volley/index.html

et rééquipement de Square: http://square.github.io/retrofit

Volley est une bonne bibliothèque HTTP asynchrone à usage général, tandis que Retrofit se concentre spécifiquement sur la mise en œuvre d'un client REST.

Ces deux bibliothèques traiteront une grande partie des détails de bas niveau que vous avez traités dans votre exemple.

Que vous continuiez à utiliser votre code DefaultHttpClient, ou à utiliser Volley ou Retrofit, vous voudrez certainement vous assurer que vos demandes réseau se produisent sur un thread en arrière-plan afin de ne pas bloquer le thread de l'interface utilisateur. Votre exemple ne permet pas de savoir si vous le faites.

0
GreyBeardedGeek