2011-02-11 18 views
17

Tengo esta cadena JSON. Quiero enviarlo al servidor (es decir, utilizando el método POST). ¿Cómo se puede hacer esto en Android?Cómo publicar datos en Android en el servidor en formato JSON?

cadena 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 
} 

¿Cómo se puede formar Me esta matriz JSON y publicarla en el servidor?

+0

posible duplicado de [¿Cómo envío JSon como BODY en una solicitud POST al servidor desde una aplicación de Android?] (http://stackoverflow.com/questions/3815522/how-do-i-send-json -como-cuerpo-en-una-solicitud-posterior-al-servidor-de-un-android-aplicación) – Thilo

+1

en el paquete org.json (http://developer.android.com/reference/org/json/package- summary.html) debe tener todo lo que necesita para construir cadena JSON. – xandy

+0

@Thilo nop que no tiene nada que ver con la forma 2 de la cadena json .... –

Respuesta

17

Lo hice yo mismo.

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) 
{ 
} 

y así es como podemos enviar datos JSON al servidor.

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

¿por qué el parámetro jsonObj en putData se llama returnJObject? ¿no representa el objeto que necesita ser enviado? También para mí no funciona, recibo "datos de entrada" del servidor con el código 200 –

+0

solo para hacer que el código a continuación esté sincronizado con el código anterior que utilicé returnJObject. Usar otro nombre no romperá el código;). pero gracias por señalar eso. Y si está recibiendo el código 200, entonces debe ser una respuesta exitosa del servidor. 200 significa "estado correcto". –

+0

sí pero la respuesta que recibo significa que el servidor no recibió ninguna entrada, intentaré hablar con el tipo que trabaja en la API (el problema debe estar allí) pero no respondió mis correos electrónicos hoy –

1

Tener un vistazo a este código

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

Véase el retrieveJSONArray (ArrayList JSONArray, clave String []) y retrieveJSONString (ArrayList JSONObject)

+0

no es exactamente lo que quería pero esta wud ayuda .... + 1 .... –

+0

u quería crear cadena JSON ....... la lógica básica está ahí en recuperar JSONString, pero está personalizada según mi lógica y requisito ....... – viv

8

Si tiene JSON como cadena ya, simplemente POST usando conexión HTTP regular (URL.openConnection()). No hay necesidad de analizarlo ni nada de eso.

+1

No tengo idea de por qué esto no fue votado. –

+0

por favor, elabore más ... ¡gracias! –

1
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(); 
    } 
} 
+0

y use el método putdatatoserver(). Pero no funciona desde el extremo del servidor –

0

si esto es distinto de una aplicación de "hobby" cualquier cosa con sólo uno o dos de servicio técnico para hacer, me gustaría considerar la búsqueda de un HTTP asincrónico o biblioteca RESTO.

Hay varias consideración merece la pena, incluyendo volea de Google: https://developer.android.com/training/volley/index.html

y de la modificación de la plaza: http://square.github.io/retrofit

voleo es buena biblioteca general HTTP asincrónico propósito, mientras que reequipamiento se concentra específicamente en la implementación de un cliente REST.

Ambas bibliotecas manejarán gran parte de los detalles de bajo nivel con los que se está tratando en su ejemplo.

Ya sea que continúe usando su código DefaultHttpClient, o use Volley o Retrofit, definitivamente querrá asegurarse de que sus solicitudes de red se realicen en un hilo de fondo para que no bloquee el hilo de UI. No está claro en tu ejemplo si estás haciendo eso.

Cuestiones relacionadas