I am looking for some guidance on how to post data to a web service in my Android application. Unfortunately this is a school project, so I'm not able to use external libraries.
The web service has a base URL, for example:
http://example.com/service/create
And takes two variables, in the following format:
username = "user1"
locationname = "location1"
The web service is RESTful and uses an XML structure, if that makes a difference. From my research I understand I should be using URLconnection rather than the deprecated HTTPconnection, but I cannot find an example of what I am looking for.
Here is my attempt, which is currently not working:
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toPost test = new toPost();
text.execute();
}
private class toPost extends AsyncTask<URL, Void, String> {
@Override
protected String doInBackground(URL... params) {
HttpURLConnection conn = null;
try {
URL url = new URL("http://example.com/service");
conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
String body = "username=user1&locationname=location1";
OutputStream output = new BufferedOutputStream(conn.getOutputStream());
output.write(body.getBytes());
output.flush();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
conn.disconnect();
}
return null;
}
}
}
My suggestion is to use Retrofit among with Jackson converter.
Retrofit supports both asynchronous and synchronous requests. It supports
GET
,POST
,PUT
,DELETE
, andHEAD
methods.Jackson will help you to parse XML to JSON object.
Both of these are very easy to use and have good documentation.
Here you can find simple tutorial for using Retrofit.
try this. (msg is the xml string )
You would have to commit the request. This can be done by calling getResponseCode(), or getResponseMessage()) or getInputStream() for the response to be returned and processed.
Working code for your example:
Yes, you should use URLConnection for making requests.
You can send xml data as a payload.
Please refer Android - Using HttpURLConnection to POST XML data
If you want to use HttpUrlConnection, you can refer to the following two samples. Hope this helps!
I would use the volley library, as suggested by google
Making a request is explained on that page, but is as simple as: