1

I just started learning android few days ago and I have a problem with uploading my JSON data to server. I manage to retrieve it via following code:

Edit: I did manage to retrieve files using external OKHTTP library but I would like to do this without using external libraries.

package cc.demorest; import android.os.AsyncTask; import android.renderscript.ScriptGroup; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.EditText; import android.widget.TextView; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DownloadTask task = new DownloadTask(); task.execute("myserver.com"); } //Downloadtask public class DownloadTask extends AsyncTask<String,Void,String> { @Override protected String doInBackground(String... urls) { String result = ""; URL url; HttpURLConnection urlConnection=null; try { url = new URL(urls[0]); urlConnection=(HttpURLConnection)url.openConnection(); InputStream in = urlConnection.getInputStream(); InputStreamReader reader = new InputStreamReader(in); int data=reader.read(); while (data !=-1){ char current=(char) data; result += current; data = reader.read(); } return result; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } //After download task @Override protected void onPostExecute(String result) { super.onPostExecute(result); try { JSONArray jArray=new JSONArray(result); JSONObject json_data = jArray.getJSONObject(1); //Logging data Log.i("Podatci: ", "Id: " + json_data.getInt("Id") + ", Name: " + json_data.getString("Name") + ", Years: " + json_data.getString("Age") + ", Email address: " + json_data.getString("Email") ); TextView textView = (TextView) findViewById(R.id.textViewName); textView.setText("ID: "+", Name: "+ json_data.getInt("Id")+json_data.getString("Name")+json_data.getString("Age")+json_data.getString("Email")); /* String data = jsonObject.getString("Name"); Log.i("Website content", data); */ } catch (JSONException e) { e.printStackTrace(); } } } } 

I am now trying to send my data to same server with same fields. I searched internet but most things that I found are outdated.. I would really appriciate some help or example. Best Regards

5
  • Refers these my solution for it:- stackoverflow.com/a/33749770/3946958 Commented Mar 9, 2016 at 8:37
  • Possible duplicate of how make Sync or Async HTTP Post/Get in Android Studio Commented Mar 9, 2016 at 8:38
  • post your uploading code where it went wrong Commented Mar 9, 2016 at 10:16
  • This code is working but it's for GET request. It pull data and display it like it should. Now i want to create POST method to put data on server, and I am not able to do it without using externals libraries and I would like to avoid that. Commented Mar 9, 2016 at 10:18
  • You also may find some examples here stackoverflow.com/questions/4543894/… Commented Mar 9, 2016 at 10:35

2 Answers 2

4

Use HttpURLConnection, it does not use external libraries. If you're going to use an HttpURLConnection, it needs to be an AsyncTask.

Here is my code from a project I completed. Hope it helps.

First, put this in your manifest.xml file before :

<uses-permission android:name="android.permission.INTERNET" /> 

Calling the AsyncTask:

(Ignore the this, SinceTime, and GoesAddress. They are just variables I passed in)

 URL url = new URL("https://eddn.usgs.gov/cgi-bin/fieldtest.pl"); new ReceiveData(this, SinceTime, GoesAddress).execute(url); 

The Class:

package com.ryan.scrapermain; import android.content.Context; import android.os.AsyncTask; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import javax.net.ssl.HttpsURLConnection; public class ReceiveData extends AsyncTask<URL, Integer, Long> { String response = ""; String SinceTime; String GoesAddress; Context myContext; ReceiveData(Context context, String since, String goes) { this.myContext = context; SinceTime = since; GoesAddress = goes; } private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException { StringBuilder feedback = new StringBuilder(); boolean first = true; for(Map.Entry<String, String> entry : params.entrySet()){ if (first) first = false; else feedback.append("&"); feedback.append(URLEncoder.encode(entry.getKey(), "UTF-8")); feedback.append("="); feedback.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } return feedback.toString(); } public void getData() throws IOException { HashMap<String, String> params = new HashMap<>(); params.put("DCPID", GoesAddress); params.put("SINCE", SinceTime); URL url = new URL("https://eddn.usgs.gov/cgi-bin/fieldtest.pl"); HttpURLConnection client = null; try { client = (HttpURLConnection) url.openConnection(); client.setRequestMethod("POST"); // You need to specify the context-type. In this case it is a // form submission, so use "multipart/form-data" client.setRequestProperty("multipart/form-data", "https://eddn.usgs.gov/fieldtest.html;charset=UTF-8"); client.setDoInput(true); client.setDoOutput(true); OutputStream os = client.getOutputStream(); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os, "UTF-8")); writer.write(getPostDataString(params)); writer.flush(); writer.close(); os.close(); int responseCode = client.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { String line; BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream())); while ((line = br.readLine()) != null) { response += line; } } else { response = ""; } } catch (MalformedURLException e){ e.printStackTrace(); } finally { if(client != null) // Make sure the connection is not null. client.disconnect(); } } @Override protected Long doInBackground(URL... params) { try { getData(); } catch (IOException e) { e.printStackTrace(); } // This counts how many bytes were downloaded final byte[] result = response.getBytes(); Long numOfBytes = Long.valueOf(result.length); return numOfBytes; } protected void onPostExecute(Long result) { System.out.println("Downloaded " + result + " bytes"); // This is just printing it to the console for now. System.out.println(response); // In the following two line I pass the string elsewhere and decode it. InputCode input = new InputCode(); input.passToDisplay(myContext, response); } } 
Sign up to request clarification or add additional context in comments.

3 Comments

Thank you Ryan, I can confirm that your solution works.
In this example, what is InputCode ?
I don’t really remember but I think it was just a class that handled the display, hence passToDisplay. InputCode must have been referring to the code entered by the user
0

Use Volley as defined here. It's far more easier.

Comments