Jak wysłać obiekt JSON na żądanie w systemie Android?


115

Chcę wysłać następujący tekst JSON

{"Email":"aaa@tbbb.com","Password":"123456"}

do usługi internetowej i przeczytaj odpowiedź. Wiem, jak czytać JSON. Problem w tym, że powyższy obiekt JSON musi być przesłany w nazwie zmiennej jason.

Jak mogę to zrobić z Androida? Jakie są kroki, takie jak tworzenie obiektu żądania, ustawianie nagłówków treści itp.

Odpowiedzi:


97

Android nie ma specjalnego kodu do wysyłania i odbierania HTTP, możesz użyć standardowego kodu Java. Polecam użycie klienta HTTP Apache, który jest dostarczany z systemem Android. Oto fragment kodu, którego użyłem do wysłania POST HTTP.

Nie rozumiem, co ma z tym wspólnego wysłanie obiektu w zmiennej o nazwie „jason”. Jeśli nie masz pewności, czego dokładnie chce serwer, rozważ napisanie programu testowego, który będzie wysyłał różne ciągi do serwera, dopóki nie będziesz wiedział, w jakim formacie ma być.

int TIMEOUT_MILLISEC = 10000;  // = 10 seconds
String postMessage="{}"; //HERE_YOUR_POST_STRING.
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);
HttpClient client = new DefaultHttpClient(httpParams);

HttpPost request = new HttpPost(serverUrl);
request.setEntity(new ByteArrayEntity(
    postMessage.toString().getBytes("UTF8")));
HttpResponse response = client.execute(request);

21
Czy postMessage jest obiektem JSON?
AndroidDev,

postMessagenie jest zdefiniowany
Raptor

jaki jest limit czasu?
Lion789

co, jeśli przekazujesz więcej niż jeden ciąg? like postMessage2.toString (). getBytes ("UTF8")
Mayur R. Amipara,

Sugestie dotyczące konwersji POJO na ciąg Json?
tgkprog

155

Wysyłanie obiektu json z systemu Android jest łatwe, jeśli używasz klienta Apache HTTP. Oto przykładowy kod pokazujący, jak to zrobić. Powinieneś utworzyć nowy wątek dla działań sieciowych, aby nie blokować wątku interfejsu użytkownika.

    protected void sendJson(final String email, final String pwd) {
        Thread t = new Thread() {

            public void run() {
                Looper.prepare(); //For Preparing Message Pool for the child Thread
                HttpClient client = new DefaultHttpClient();
                HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit
                HttpResponse response;
                JSONObject json = new JSONObject();

                try {
                    HttpPost post = new HttpPost(URL);
                    json.put("email", email);
                    json.put("password", pwd);
                    StringEntity se = new StringEntity( json.toString());  
                    se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
                    post.setEntity(se);
                    response = client.execute(post);

                    /*Checking response */
                    if(response!=null){
                        InputStream in = response.getEntity().getContent(); //Get the data in the entity
                    }

                } catch(Exception e) {
                    e.printStackTrace();
                    createDialog("Error", "Cannot Estabilish Connection");
                }

                Looper.loop(); //Loop in the message queue
            }
        };

        t.start();      
    }

Możesz także użyć Google Gson do wysyłania i pobierania JSON.


Cześć, czy to możliwe, że serwer wymaga ode mnie ustawienia nagłówka wywoływanego w formacie JSON i umieszczenia zawartości json w tym nagłówku? Wysyłam adres URL jako HttpPost post = new HttpPost (" abc.com/xyz/usersgetuserdetails" ); Ale mówi, że błąd żądania jest nieprawidłowy. Remiander kodu jest taki sam. Po drugie, co robi json = header = new JSONObject (); Co się tutaj dzieje
AndroidDev

Nie jestem pewien, jakiego rodzaju żądania oczekuje serwer. Co do tego 'json = header = new JSONObject (); „to po prostu utworzenie 2 obiektów json.
Primal Pappachan

@primpop - Czy jest jakaś szansa, że ​​będziesz w stanie dostarczyć prosty skrypt php, który to zrobi? Próbowałem zaimplementować twój kod, ale do końca życia nie udało mi się go wysłać do niczego innego niż NULL.
kubiej21

możesz pobrać dane wyjściowe z inputsputstream (w obiekcie tutaj) jako łańcuch, taki jak ten StringWriter writer = new StringWriter (); IOUtils.copy (in, writer, "UTF-8"); String theString = writer.toString ();
Yekmer Simsek

35
public void postData(String url,JSONObject obj) {
    // Create a new HttpClient and Post Header

    HttpParams myParams = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(myParams, 10000);
    HttpConnectionParams.setSoTimeout(myParams, 10000);
    HttpClient httpclient = new DefaultHttpClient(myParams );
    String json=obj.toString();

    try {

        HttpPost httppost = new HttpPost(url.toString());
        httppost.setHeader("Content-type", "application/json");

        StringEntity se = new StringEntity(obj.toString()); 
        se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
        httppost.setEntity(se); 

        HttpResponse response = httpclient.execute(httppost);
        String temp = EntityUtils.toString(response.getEntity());
        Log.i("tag", temp);


    } catch (ClientProtocolException e) {

    } catch (IOException e) {
    }
}

Wysłałem obiekt json do serwera mvc ASP.Net. Jak mogę wysłać zapytanie o ten sam ciąg json na serwerze ASP.Net.?
Karthick

19

HttpPostjest przestarzały przez Android Api Level 22. Skorzystaj więc HttpUrlConnectiondalej.

public static String makeRequest(String uri, String json) {
    HttpURLConnection urlConnection;
    String url;
    String data = json;
    String result = null;
    try {
        //Connect 
        urlConnection = (HttpURLConnection) ((new URL(uri).openConnection()));
        urlConnection.setDoOutput(true);
        urlConnection.setRequestProperty("Content-Type", "application/json");
        urlConnection.setRequestProperty("Accept", "application/json");
        urlConnection.setRequestMethod("POST");
        urlConnection.connect();

        //Write
        OutputStream outputStream = urlConnection.getOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
        writer.write(data);
        writer.close();
        outputStream.close();

        //Read
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));

        String line = null;
        StringBuilder sb = new StringBuilder();

        while ((line = bufferedReader.readLine()) != null) {
            sb.append(line);
        }

        bufferedReader.close();
        result = sb.toString();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}

1
Przyjęta odpowiedź jest amortyzowana i takie podejście jest lepsze
CoderBC

8

Pod poniższym linkiem dostępna jest zaskakująco ładna biblioteka dla protokołu HTTP dla Androida:

http://loopj.com/android-async-http/

Proste żądania są bardzo łatwe:

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(String response) {
        System.out.println(response);
    }
});

Aby wysłać JSON (kredyt do `voidberg 'na https://github.com/loopj/android-async-http/issues/125 ):

// params is a JSONObject
StringEntity se = null;
try {
    se = new StringEntity(params.toString());
} catch (UnsupportedEncodingException e) {
    // handle exceptions properly!
}
se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));

client.post(null, "www.example.com/objects", se, "application/json", responseHandler);

Wszystko jest asynchroniczne, działa dobrze z systemem Android i bezpieczne do wywoływania z wątku interfejsu użytkownika. Obiekt responseHandler będzie działał w tym samym wątku, z którego został utworzony (zazwyczaj jest to wątek interfejsu użytkownika). Ma nawet wbudowany resonseHandler dla JSON, ale wolę używać google gson.


Czy znasz minimalne SDK, na którym to działa?
Esko918

Byłbym zdziwiony, gdyby miał minimum, ponieważ nie jest to GUI. Wypróbuj go i opublikuj swoje odkrycia.
Alex

1
Cóż, zdecydowałem się zamiast tego użyć natywnych bibliotek. Jest więcej informacji na ten temat, a ponieważ jestem całkiem nowy w Androidzie. Jestem naprawdę programistą iOS. Jest lepiej, odkąd czytam wszystkie dokumenty zamiast tylko podłączać i bawić się czyimś kodem. Jednak dzięki
Esko918

3

Odkąd HttpClientjest przestarzały, obecnie działający kod ma używać HttpUrlConnectiondo tworzenia połączenia oraz zapisywania i odczytywania połączenia. Ale wolałem używać salwy . Ta biblioteka pochodzi z systemu Android AOSP. Znalazłem bardzo łatwy w użyciu JsonObjectRequestlubJsonArrayRequest


2

Nie ma nic prostszego niż to. Użyj OkHttpLibrary

Utwórz plik json

JSONObject requestObject = new JSONObject();
requestObject.put("Email", email);
requestObject.put("Password", password);

i wyślij to w ten sposób.

OkHttpClient client = new OkHttpClient();

RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
            .addHeader("Content-Type","application/json")
            .url(url)
            .post(requestObject.toString())
            .build();

okhttp3.Response response = client.newCall(request).execute();

Głosowano za wskazaniem na okhttp, która jest użyteczną biblioteką, ale podany kod niewiele pomaga. Na przykład, jakie argumenty są przekazywane do RequestBody.create ()? Zobacz ten link, aby uzyskać więcej informacji: vogella.com/tutorials/JavaLibrary-OkHttp/article.html
Dabbler

0
public class getUserProfile extends AsyncTask<Void, String, JSONArray> {
    JSONArray array;
    @Override
    protected JSONArray doInBackground(Void... params) {

        try {
            commonurl cu = new commonurl();
            String u = cu.geturl("tempshowusermain.php");
            URL url =new URL(u);
          //  URL url = new URL("http://192.168.225.35/jabber/tempshowusermain.php");
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setRequestProperty("Content-Type", "application/json");
            httpURLConnection.setRequestProperty("Accept", "application/json");
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
            httpURLConnection.setDoInput(true);
            httpURLConnection.connect();

            JSONObject jsonObject=new JSONObject();
            jsonObject.put("lid",lid);


            DataOutputStream outputStream = new DataOutputStream(httpURLConnection.getOutputStream());
            outputStream.write(jsonObject.toString().getBytes("UTF-8"));

            int code = httpURLConnection.getResponseCode();
            if (code == 200) {
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));

                StringBuffer stringBuffer = new StringBuffer();
                String line;

                while ((line = bufferedReader.readLine()) != null) {
                    stringBuffer.append(line);
                }
                object =  new JSONObject(stringBuffer.toString());
             //   array = new JSONArray(stringBuffer.toString());
                array = object.getJSONArray("response");

            }

        } catch (Exception e) {

            e.printStackTrace();
        }
        return array;


    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();



    }

    @Override
    protected void onPostExecute(JSONArray array) {
        super.onPostExecute(array);
        try {
            for (int x = 0; x < array.length(); x++) {

                object = array.getJSONObject(x);
                ComonUserView commUserView=new ComonUserView();//  commonclass.setId(Integer.parseInt(jsonObject2.getString("pid").toString()));
                //pidArray.add(jsonObject2.getString("pid").toString());

                commUserView.setLid(object.get("lid").toString());
                commUserView.setUname(object.get("uname").toString());
                commUserView.setAboutme(object.get("aboutme").toString());
                commUserView.setHeight(object.get("height").toString());
                commUserView.setAge(object.get("age").toString());
                commUserView.setWeight(object.get("weight").toString());
                commUserView.setBodytype(object.get("bodytype").toString());
                commUserView.setRelationshipstatus(object.get("relationshipstatus").toString());
                commUserView.setImagepath(object.get("imagepath").toString());
                commUserView.setDistance(object.get("distance").toString());
                commUserView.setLookingfor(object.get("lookingfor").toString());
                commUserView.setStatus(object.get("status").toString());

                cm.add(commUserView);
            }
            custuserprof = new customadapterformainprofile(getActivity(),cm,Tab3.this);
          gridusername.setAdapter(custuserprof);
            //  listusername.setAdapter(custuserprof);
            } catch (Exception e) {

                e.printStackTrace();
        }
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.