from: http://blog.dahanne.net/2009/08/16/how-to-access-http-resources-from-android/
First Method : getting an input stream given a simple url from Android using HttpURLConnection
This method is the most basic one : it allows you, using the basic HttpUrlConnection, ( contained in java.net) to get an InputStream from an Url :
private InputStream downloadUrl(String url) {
HttpURLConnection con = null;
URL url;
InputStream is=null;
try {
url = new URL(url);
con = (HttpURLConnection) url.openConnection();
con.setReadTimeout(10000 /* milliseconds */);
con.setConnectTimeout(15000 /* milliseconds */);
con.setRequestMethod("GET");
con.setDoInput(true);
con.addRequestProperty("Referer", "http://blog.dahanne.net");
// Start the query
con.connect();
is = con.getInputStream();
}catch (IOException e) {
//handle the exception !
e.printStackTrace();
}
return is;
}
You can also use the Post method, sending data in the HTTP POST payload :
private InputStream downloadUrl(String url) {
InputStream myInputStream =null;
StringBuilder sb = new StringBuilder();
//adding some data to send along with the request to the server
sb.append("name=Anthony");
URL url;
try {
url = new URL(url);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
OutputStreamWriter wr = new OutputStreamWriter(conn
.getOutputStream());
// this is were we're adding post data to the request
wr.write(sb.toString());
wr.flush();
myInputStream = conn.getInputStream();
wr.close();
} catch (Exception e) {
//handle the exception !
Log.d(TAG,e.getMessage());
}
return myInputStream;
}
But there are better ways to achieve that, using Apache HttpClient, included in android.jar (no need to add another jar, it’s included in android core)
Second Method : getting an input stream given a simple url from Android using HttpClient
Why is it a better to do it ? because the simpler, the better ! See by yourself :
public static InputStream getInputStreamFromUrl(String url) {
InputStream content = null;
try {
HttpGet httpGet = new HttpGet(url);
HttpClient httpclient = new DefaultHttpClient();
// Execute HTTP Get Request
HttpResponse response = httpclient.execute(httpGet);
content = response.getEntity().getContent();
} catch (Exception e) {
//handle the exception !
}
return content;
}
But you maybe wondering if it’s still easy with HTTP Post method ? You won’t be deceived !
public static InputStream getInputStreamFromUrl(String url) {
InputStream content = null;
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
List nameValuePairs = new ArrayList(1);
//this is where you add your data to the post method
nameValuePairs.add(new BasicNameValuePair(
"name", "anthony"));
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httpPost);
content = response.getEntity().getContent();
return content;
}
}
But what if you want to read a cookie from the response ? And how can you send a cookie back to the server for the next request ?
Reading / Sending a cookie along with the requests
Using Apache HttpClient, it’s easy to retrieve cookies ! Everything is in the headers after all !
[...]
Cookie sessionCookie =null;
HttpResponse response = httpclient.execute(httpPost);
Header[] allHeaders = response.getAllHeaders();
CookieOrigin origin = new CookieOrigin(host, port,path, false);
for (Header header : allHeaders) {
List parse = cookieSpecBase.parse(header, origin);
for (Cookie cookie : parse) {
// THE cookie
if (cookie.getName().equals(COOKIE_I_WAS_LOOKING_FOR)
&& cookie.getValue() != null && cookie.getValue() != "") {
sessionCookie = cookie;
}
}
}
To send a cookie along with your request, keep it simple :
HttpPost httpPost = new HttpPost(url);
CookieSpecBase cookieSpecBase = new BrowserCompatSpec();
List cookies = new ArrayList();
cookies.add(sessionCookie);
List cookieHeader = cookieSpecBase.formatCookies(cookies);
// Setting the cookie
httpPost.setHeader(cookieHeader.get(0));
What about the resulting InputStream ? You definitely want to transform it into a String or an Drawable (to set it to an ImageView for example !) don’t you ?
Converting the InputStream into a Drawable in Android
The Drawable class already handles that for you :
Drawable d = Drawable.createFromStream(myInputStream, "nameOfMyResource");
Converting the InputStream into a String in Android
This is some classic java stuff (don’t tell about how easier it is in Ruby.. I know … but hey ! Java SE7 at the rescue with NIO !!! maybe one day in 2010 ! )
BufferedReader rd = new BufferedReader(new InputStreamReader(myInputStreamToReadIntoAString), 4096);
String line;
StringBuilder sb = new StringBuilder();
while ((line = rd.readLine()) != null) {
sb.append(line);
}
rd.close();
String contentOfMyInputStream = sb.toString()
That's it folks ! If you have any other methods to achieve these goals, feel free to share them sending a comment !
分享到:
相关推荐
Different ways to include jQuery in your website Different ways to include jQuery in your website
6 Different Ways to Compensate for Missing Values In a Dataset
Different Methods to call Web Service from AJAX
Different ways to make a head Different ways to make a head Urs Schmidt-Ott Summary In Drosophila, the establishment of the larval head and thorax depends on the transcription factors BICOID and ...
Four different tricks to bypass StackShield and StackGuard protection Four different tricks to bypass StackShield and StackGuard protection Four different tricks to bypass StackShield and StackGuard ...
Discover how to leverage SE for Android to secure your own projects in powerful ways using this step by step guide. Who This Book Is For This book is intended for developers and engineers with some ...
learn how Android applications are structured and how to include resources, such as strings, graphics, and user interface components, in your projects. This section is of primary interest to ...
Gaming in android is an already established market and growing each day. Previously games were made for specific platforms, but...Familiarize yourself with different ways to earn money from Android Games
A simple example that illustrates a few different ways for an application to implement support for the Android data backup and restore mechanism. Bluetooth Chat An application for two-way text ...
access lists that control access to router resources and to hosts, and discusses the tradeoffs of different kinds of access lists. The chapter includes explanations of how certain protocols work and...
different random access methods comparison
Familiarize yourself with different ways to earn money from Android Games In Detail Gaming in android is an already established market and growing each day. Previously games were made for specific ...
This book aims to give you a ... They also experimented with XP practices - different ways of doing continuous build, pair programming, test driven development, etc, and how to combine this with Scrum.
Taking Advantage of All Android Has to Offer 22 The Android Marketplace: Where We Are Now 22 Android Platform Differences 23 Android: A Next-Generation Platform 23 Free and Open Source 25 Familiar and...
Android, the next-generation open mobile platform from Google and the Open Handset Alliance, is poised to become a significant player in the mobile device market. The Android platform gives developers...
What you need to do in order to use the simulator instead of the android API, is to change the import from android.bluetooth to dk.itu.android.bluetooth (and also add the INTERNET permission in the ...
In this post I show 5 different ways to change which URLs your app listens on. There are multiple ways to set the URLs that ASP.NET Core binds to on startup. I have an old post about the various ...
This is a fun quest to find out different ways to print "Hello
How to bind data to different DataTemplate in Universal Windows Platform apps
What You Will Learn, Build new Android apps and libraries using Android Studio and Gradle, Migrate projects from Eclipse to Android Studio and Gradle, Manage the local and remote dependencies of your...