Different ways to access HTTP resources from Android(cf)
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 querycon.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 serversb.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 RequestHttpResponse 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 RequestHttpResponse 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 cookieif (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 cookiehttpPost.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 !
更多相关文章
- 代码中设置drawableleft
- android 3.0 隐藏 系统标题栏
- Android开发中activity切换动画的实现
- Android(安卓)学习 笔记_05. 文件下载
- Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
- 技术博客汇总
- android 2.3 wifi (一)
- AndRoid Notification的清空和修改
- Android中的Chronometer