Tuesday, 27 December 2016

Android: Send “POST” JSON Data to Server

The following blog provide a great example of posting JSON data to Server:

                               http://hmkcode.com/android-send-json-data-to-server/


But there are a few problems to be solved before successfully running.

(1) Check:
http://boriscoding.blogspot.ca/2016/12/fail-to-import-orgapachehttpxxx-stuff.html

(2) Check:
http://boriscoding.blogspot.ca/2016/12/error-method-gettext-must-be-called.html
And my MainActivity.java


import android.support.v7.app.AppCompatActivity;import android.os.Bundle;
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.DefaultHttpClient;import org.json.JSONObject;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.os.AsyncTask;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import android.app.Activity;
public class MainActivity extends Activity implements OnClickListener {

    TextView tvIsConnected;    EditText etName,etCountry,etTwitter;    Button btnPost;
    Person person;    String got_etName,got_etCountry,got_etTwitter;    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);
        // get reference to the views        tvIsConnected = (TextView) findViewById(R.id.tvIsConnected);        etName = (EditText) findViewById(R.id.etName);        etCountry = (EditText) findViewById(R.id.etCountry);        etTwitter = (EditText) findViewById(R.id.etTwitter);        btnPost = (Button) findViewById(R.id.btnPost);
        // check if you are connected or not        if(isConnected()){
            tvIsConnected.setBackgroundColor(0xFF00CC00);            tvIsConnected.setText("You are conncted");        }
        else{
            tvIsConnected.setText("You are NOT conncted");        }

        // add click listener to Button "POST"        btnPost.setOnClickListener(this);
    }

    public static String POST(String url, Person person){
        InputStream inputStream = null;        String result = "";        try {

            // 1. create HttpClient            HttpClient httpclient = new DefaultHttpClient();
            // 2. make POST request to the given URL            HttpPost httpPost = new HttpPost(url);
            String json = "";
            // 3. build jsonObject            JSONObject jsonObject = new JSONObject();            jsonObject.accumulate("name", person.getName());            jsonObject.accumulate("country", person.getCountry());            jsonObject.accumulate("twitter", person.getTwitter());
            // 4. convert JSONObject to JSON to String            json = jsonObject.toString();
            // ** Alternative way to convert Person object to JSON string usin Jackson Lib            // ObjectMapper mapper = new ObjectMapper();            // json = mapper.writeValueAsString(person);
            // 5. set json to StringEntity            StringEntity se = new StringEntity(json);
            // 6. set httpPost Entity            httpPost.setEntity(se);
            // 7. Set some headers to inform server about the type of the content            httpPost.setHeader("Accept", "application/json");            httpPost.setHeader("Content-type", "application/json");
            // 8. Execute POST request to the given URL            HttpResponse httpResponse = httpclient.execute(httpPost);
            // 9. receive response as inputStream            inputStream = httpResponse.getEntity().getContent();
            // 10. convert inputstream to string            if(inputStream != null)
                result = convertInputStreamToString(inputStream);            else                result = "Did not work!";
        } catch (Exception e) {
            Log.d("InputStream", e.getLocalizedMessage());        }

        // 11. return result        return result;    }

    public boolean isConnected(){
        ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Activity.CONNECTIVITY_SERVICE);        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();        if (networkInfo != null && networkInfo.isConnected())
            return true;        else            return false;    }
    @Override    public void onClick(View view) {

        switch(view.getId()){
            case R.id.btnPost:
                if(!validate())
                    Toast.makeText(getBaseContext(), "Enter some data!", Toast.LENGTH_LONG).show();                // call AsynTask to perform network operation on separate thread                new HttpAsyncTask().execute("http://hmkcode.appspot.com/jsonservlet");                break;        }

        got_etName = etName.getText().toString();        got_etCountry = etCountry.getText().toString();        got_etTwitter = etTwitter.getText().toString();    }

    // Helps in creating the connection in a separate thread so the UI will not freeze.    private class HttpAsyncTask extends AsyncTask<String, Void, String> {
        @Override        protected String doInBackground(String... urls) {

            person = new Person();            person.setName(got_etName);            person.setCountry(got_etCountry);            person.setTwitter(got_etTwitter);
            //person.setName(etName.getText().toString());            //person.setCountry(etCountry.getText().toString());            //person.setTwitter(etTwitter.getText().toString());
            return POST(urls[0],person);        }
        // onPostExecute displays the results of the AsyncTask.        @Override        protected void onPostExecute(String result) {
            Toast.makeText(getBaseContext(), "Data Sent!", Toast.LENGTH_LONG).show();        }
    }

    // Helper method to check that data is not empty before send the request.    private boolean validate(){
        if(etName.getText().toString().trim().equals(""))
            return false;        else if(etCountry.getText().toString().trim().equals(""))
            return false;        else if(etTwitter.getText().toString().trim().equals(""))
            return false;        else            return true;    }

    // Helper method to convert inputstream to String    private static String convertInputStreamToString(InputStream inputStream) throws IOException{
        BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));        String line = "";        String result = "";        while((line = bufferedReader.readLine()) != null)
            result += line;
        inputStream.close();        return result;
    }
}




No comments:

Post a Comment