Como enviar um objeto JSON por solicitação com Android?

115

Quero enviar o seguinte texto JSON

{"Email":"[email protected]","Password":"123456"}

a um serviço da web e leia a resposta. Eu sei como ler JSON. O problema é que o objeto JSON acima deve ser enviado em um nome de variável jason.

Como posso fazer isso pelo Android? Quais são as etapas, como criação de objeto de solicitação, configuração de cabeçalhos de conteúdo, etc.

AndroidDev
fonte

Respostas:

97

O Android não possui um código especial para enviar e receber HTTP, você pode usar o código Java padrão. Eu recomendo usar o cliente Apache HTTP, que vem com o Android. Aqui está um trecho de código que usei para enviar um HTTP POST.

Não entendo o que enviar o objeto em uma variável chamada "jason" tem a ver com qualquer coisa. Se você não tiver certeza do que exatamente o servidor deseja, considere escrever um programa de teste para enviar várias strings ao servidor até saber em que formato elas precisam estar.

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
fonte
21
O postMessage é um objeto JSON?
AndroidDev
postMessagenão está definido
Raptor
para que é o tempo limite?
Lion789
e se passar mais de uma string? como postMessage2.toString (). getBytes ("UTF8")
Mayur R. Amipara
Sugestões para converter um POJO em string Json?
tgkprog
155

Enviar um objeto json do Android é fácil se você usar o cliente Apache HTTP. Aqui está um exemplo de código sobre como fazer isso. Você deve criar um novo thread para atividades de rede de modo a não bloquear o thread de IU.

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

Você também pode usar o Google Gson para enviar e recuperar JSON.

Pappachan Primal
fonte
Olá, será possível que o servidor exija que eu defina um cabeçalho chamado JSON e coloque o conteúdo json nesse cabeçalho? Estou enviando a url como HttpPost post = new HttpPost (" abc.com/xyz/usersgetuserdetails" ); Mas está dizendo erro de solicitação inválida. O remiander do código é o mesmo. Em segundo lugar, o que json = header = new JSONObject (); O que está acontecendo aqui
AndroidDev
Não tenho certeza de que tipo de solicitação é esperada pelo servidor. Quanto a este 'json = header = new JSONObject (); 'é apenas criar 2 objetos json.
Primal Pappachan
@primpop - Existe alguma chance de você ser capaz de fornecer um script php simples para acompanhar isso? Eu tentei implementar seu código, mas eu nunca consegui fazer com que ele enviasse nada além de NULL.
kubiej21
você pode obter a saída de inputsputstream (no objeto aqui) como string como este StringWriter writer = new StringWriter (); IOUtils.copy (em, escritor, "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
fonte
Eu postei o objeto json no servidor ASP.Net mvc. Como posso consultar a mesma string json no servidor ASP.Net.?
Karthick,
19

HttpPostfoi descontinuado pelo Android Api Nível 22. Portanto, use HttpUrlConnectionpara mais.

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
fonte
1
A resposta aceita é depreciada e esta abordagem é melhor
CoderBC
8

Há uma biblioteca surpreendentemente boa para Android HTTP disponível no link abaixo:

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

Solicitações simples são muito fáceis:

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

Para enviar JSON (crédito para `voidberg 'em 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);

É tudo assíncrono, funciona bem com Android e é seguro para fazer chamadas a partir do thread de interface do usuário. O responseHandler será executado no mesmo thread a partir do qual você o criou (normalmente, seu thread de IU). Ele ainda tem um resonseHandler integrado para JSON, mas eu prefiro usar o google gson.

Alex
fonte
Você sabe o SDK mínimo em que isso funciona?
Esko918
Eu ficaria surpreso se tivesse um mínimo, pois não é GUI. Por que não experimentar e publicar suas descobertas.
Alex
1
Bem, eu decidi usar as bibliotecas nativas. Theres mais informações sobre isso e como sou bastante novo para Android. Eu sou realmente um desenvolvedor iOS. É melhor, pois estou lendo todos os documentos em vez de apenas conectar e brincar com o código de outra pessoa. Mas obrigado
Esko918
3

Agora, como o HttpClientestá obsoleto, o código de trabalho atual é usar o HttpUrlConnectionpara criar a conexão e escrever e ler a partir da conexão. Mas preferi usar o Volley . Esta biblioteca é do android AOSP. Achei muito fácil de usar para fazer JsonObjectRequestouJsonArrayRequest

Sanjeet A
fonte
2

Nada poderia ser simples do que isso. Use OkHttpLibrary

Crie o seu json

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

e envie assim.

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
fonte
Votado por apontar para okhttp, que é uma biblioteca útil, mas o código fornecido não ajuda muito. Por exemplo, quais são os argumentos passados ​​para RequestBody.create ()? Veja este link para mais detalhes: 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
fonte