Как отправить данные в Android на сервер в формате JSON? - PullRequest
17 голосов
/ 11 февраля 2011

У меня есть эта строка JSON.Я хочу отправить его на сервер (то есть, используя метод POST).Как это можно сделать в Android?

Строка 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
}

Как мне сформировать этот массив JSON и отправить его на сервер?

Ответы [ 6 ]

17 голосов
/ 23 февраля 2011

Я сделал это сам.

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

и вот как мы можем отправлять данные JSON на сервер.

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();
}
8 голосов
/ 12 февраля 2011

Если у вас уже есть JSON в качестве String, просто отправьте его, используя обычное соединение HTTP (URL.openConnection ()) Не нужно разбирать его или что-то в этом роде.

1 голос
/ 10 декабря 2015
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 голос
/ 11 февраля 2011

Посмотрите на этот код

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

См. retrieveJSONArray (ArrayList jsonArray, ключ String []) и retrieveJSONString (ArrayList jsonObject)

0 голосов
/ 19 декабря 2016

Вы также можете использовать Httpurlconnection , пожалуйста, проверьте ссылку, и вы получите больше идей. или Httpsurlconnection

0 голосов
/ 25 июля 2016

Если это не что иное, как приложение "Хобби", для которого требуется всего один или два вызова службы, я бы посоветовал взглянуть на асинхронную библиотеку HTTP или REST.

Есть несколько достойных внимания, в том числе залп от Google: https://developer.android.com/training/volley/index.html

и дооснащение с площади: http://square.github.io/retrofit

Volley - хорошая асинхронная библиотека HTTP общего назначения, тогда как Retrofit специально концентрируется на реализации клиента REST.

Обе эти библиотеки будут обрабатывать большую часть деталей низкого уровня, с которыми вы имеете дело в вашем примере.

Независимо от того, продолжаете ли вы использовать код DefaultHttpClient или используете Volley или Retrofit, вы определенно захотите убедиться, что ваши сетевые запросы выполняются в фоновом потоке, чтобы вы не блокировали поток пользовательского интерфейса. Из вашего примера не ясно, делаете ли вы это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...