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

115

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

{"Email":"[email protected]","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.

AndroidDev
źródło

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);
dmazzoni
źródło
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.

Pierwotny Pappachan
źródło
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) {
    }
}
Sachin Gurnani
źródło
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;
}
vikoo
źródło
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.

Alex
źródło
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

Sanjeet A
źródło
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();
Dave Ranjan
źródło
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();
        }
    }
Niral Dharmnathi
źródło