Java tutorial
/*** * Copyright (c) 2011-2012 WareNinja.com * http://www.WareNinja.com - https://github.com/WareNinja * * Author: yg@wareninja.com / twitter: @WareNinja * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * source adapted from: * https://github.com/wareninja * http://www.josecgomez.com/2010/04/30/android-accessing-restfull-web-services-using-json/ */ package com.wareninja.android.opensource.mongolab_sdk.common; import java.io.BufferedOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.Map; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.params.ClientPNames; import org.apache.http.client.params.CookiePolicy; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.HttpContext; import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; public class WebService { private static final String TAG = WebService.class.getSimpleName(); DefaultHttpClient httpClient; HttpContext localContext; private String ret; private final static int TIMEOUT = 30000; private Collection<RequestHeader> headers = new LinkedList<RequestHeader>(); HttpResponse response = null; HttpDelete httpDelete = null; // DELETE HttpPut httpPut = null;// PUT HttpPost httpPost = null; // POST HttpGet httpGet = null; // GET String webServiceUrl; Integer mHttpResponseCode = null; // The serviceName should be the name of the Service you are going to be // using. public WebService(String serviceName) { HttpParams myParams = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(myParams, TIMEOUT); HttpConnectionParams.setSoTimeout(myParams, TIMEOUT); httpClient = new DefaultHttpClient(myParams); localContext = new BasicHttpContext(); webServiceUrl = serviceName; } public WebService() { HttpParams myParams = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(myParams, TIMEOUT); HttpConnectionParams.setSoTimeout(myParams, TIMEOUT); httpClient = new DefaultHttpClient(myParams); localContext = new BasicHttpContext(); } public void setWebServiceUrl(String serviceName) { webServiceUrl = serviceName; } public String getWebServiceUrl() { return webServiceUrl; } // added by YG public Integer getHttpResponseCode() { return mHttpResponseCode; } public void addRequestHeader(final String key, final String value) { if (AppContext.isDebugMode()) Log.d(TAG, "addRequestHeader->" + "key:" + key + "|value:" + value); if (TextUtils.isEmpty(key) || TextUtils.isEmpty(value)) return; this.headers.add(new PlainRequestHeader(key, value)); } public void setRequestHeaders(final Collection<RequestHeader> headers) { this.headers = new LinkedList<RequestHeader>(headers); } private void appendRequestHeaders(final HttpURLConnection conn, final Collection<RequestHeader> headers) { for (RequestHeader header : headers) { if (header != null) { conn.addRequestProperty(header.getKey(), header.getValue()); } } } // added by YG public String getJsonFromParams(Bundle params) {// this has some fup on // TagLoco action, couldnt // find what!!! Map<String, Object> paramsMap = new LinkedHashMap<String, Object>(); String valStr; Object valObj; for (String key : params.keySet()) { valObj = params.get(key); if (valObj instanceof String) { // ugly check if the string value is JSONObj or JSONArr valStr = "" + valObj; valObj = null; try { valObj = new JSONObject(valStr); } catch (JSONException ex) { valObj = null; } if (valObj == null) { try { valObj = new JSONArray(valStr); } catch (JSONException ex) { valObj = null; } } if (valObj == null) valObj = valStr; } if (valObj != null) paramsMap.put(key, valObj); } return getJsonFromParams(paramsMap); } public String getJsonFromParams2(Bundle params) { Map<String, Object> paramsMap = new LinkedHashMap<String, Object>(); String valStr; Object valObj; for (String key : params.keySet()) { valObj = params.get(key); if (valObj instanceof String) { // ugly check if the string value is JSONObj or JSONArr valStr = "" + valObj; // if (AppContext.isDebugMode()) Log.d(TAG, "valStr->"+valStr); valObj = null; try { valObj = new JSONObject(valStr); // note: very ugly hack just for tag loco part! if (valStr.contains("{") && valStr.contains("lat") && valStr.contains("lng")) { LinkedHashMap<String, Object> tempMap = new LinkedHashMap<String, Object>(); tempMap.put("lng", ((JSONObject) valObj).get("lng")); tempMap.put("lat", ((JSONObject) valObj).get("lat")); JSONObject tempJson = new JSONObject(tempMap); if (AppContext.isDebugMode()) Log.d(TAG, "tempJson->" + tempJson + "| len:" + tempJson.length()); if (AppContext.isDebugMode()) Log.d(TAG, "valObj(before)->" + valObj); if (tempJson.length() > 0) { valObj = tempJson; } if (AppContext.isDebugMode()) Log.d(TAG, "valObj(after)->" + valObj); } } catch (JSONException ex) { valObj = null; } if (valObj == null) { try { valObj = new JSONArray(valStr); } catch (JSONException ex) { valObj = null; } } if (valObj == null) valObj = valStr; } if (valObj != null) paramsMap.put(key, valObj); } return getJsonFromParams(paramsMap); } public String getJsonFromParams(Map<String, Object> params) { JSONObject jsonObject = new JSONObject(); for (Map.Entry<String, Object> param : params.entrySet()) { try { jsonObject.put(param.getKey(), param.getValue()); } catch (JSONException e) { Log.e(TAG, "JSONException : " + e); } } return jsonObject.toString(); } public String webInvokeWithJson(String methodName, String jsonStr) { return webInvokePOST(methodName, jsonStr, "application/json"); } // Use this method to do a HttpPost\WebInvoke on a Web Service public String webInvoke(String methodName, Map<String, Object> params) { JSONObject jsonObject = new JSONObject(); for (Map.Entry<String, Object> param : params.entrySet()) { try { jsonObject.put(param.getKey(), param.getValue()); } catch (JSONException e) { Log.e(TAG, "JSONException : " + e); } } return webInvokePOST(methodName, jsonObject.toString(), "application/json"); } public String webInvokePOST(String methodName, String data, String contentType) { ret = null; httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109); httpPost = new HttpPost(webServiceUrl + methodName); response = null; StringEntity tmp = null; // httpPost.setHeader("User-Agent", "SET YOUR USER AGENT STRING HERE"); httpPost.setHeader("Accept", "text/html,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"); for (RequestHeader header : headers) { if (header != null) { httpPost.setHeader(header.getKey(), header.getValue()); } } if (!TextUtils.isEmpty(contentType)) { httpPost.setHeader("Content-Type", contentType); } else { httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded"); } if (!TextUtils.isEmpty(data)) { try { tmp = new StringEntity(data, "UTF-8"); } catch (UnsupportedEncodingException e) { Log.e(TAG, "HttpUtils : UnsupportedEncodingException : " + e); } } httpPost.setEntity(tmp); if (AppContext.isDebugMode()) Log.d(TAG, "webInvokePOST -> " + webServiceUrl + methodName + " |data: " + data); try { response = httpClient.execute(httpPost, localContext); if (response != null) { ret = EntityUtils.toString(response.getEntity()); } if (response.getStatusLine() != null) mHttpResponseCode = response.getStatusLine().getStatusCode(); } catch (Exception e) { Log.e(TAG, "HttpUtils: " + e); } return ret; } public String webInvokeWithJsonPUT(String methodName, String jsonStr) { return webInvokePUT(methodName, jsonStr, "application/json"); } private String webInvokePUT(String methodName, String data, String contentType) { ret = null; httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109); httpPut = new HttpPut(webServiceUrl + methodName); response = null; StringEntity tmp = null; // httpPost.setHeader("User-Agent", "SET YOUR USER AGENT STRING HERE"); httpPut.setHeader("Accept", "text/html,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"); for (RequestHeader header : headers) { if (header != null) { httpPut.setHeader(header.getKey(), header.getValue()); } } if (contentType != null) { httpPut.setHeader("Content-Type", contentType); } else { httpPut.setHeader("Content-Type", "application/x-www-form-urlencoded"); } try { tmp = new StringEntity(data, "UTF-8"); } catch (UnsupportedEncodingException e) { Log.e(TAG, "HttpUtils : UnsupportedEncodingException : " + e); } httpPut.setEntity(tmp); if (AppContext.isDebugMode()) Log.d(TAG, webServiceUrl + "?" + data); try { response = httpClient.execute(httpPut, localContext); if (response != null) { ret = EntityUtils.toString(response.getEntity()); } if (response.getStatusLine() != null) mHttpResponseCode = response.getStatusLine().getStatusCode(); } catch (Exception e) { Log.e(TAG, "HttpUtils: " + e); } return ret; } // Use this method to do a HttpGet/WebGet on the web service public String webGet(String methodName, Bundle params) { Map<String, String> reqParams = new HashMap<String, String>(); // TODO: do checks to avoid fups! for (String key : params.keySet()) { // reqParams.put(key, params.getString(key)); reqParams.put(key, params.get(key) + ""); } return webGet(methodName, reqParams); } public String webGet(String methodName, Map<String, String> params) { String getUrl; if (methodName.startsWith(webServiceUrl)) { getUrl = methodName; } else { getUrl = webServiceUrl + methodName; } int i = 0; for (Map.Entry<String, String> param : params.entrySet()) { if (i == 0) { getUrl += "?"; } else { getUrl += "&"; } try { getUrl += param.getKey() + "=" + URLEncoder.encode(param.getValue(), "UTF-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } i++; } httpGet = new HttpGet(getUrl); if (AppContext.isDebugMode()) Log.d(TAG, "WebGetURL: " + getUrl); for (RequestHeader header : headers) { if (header != null) { httpGet.setHeader(header.getKey(), header.getValue()); if (AppContext.isDebugMode()) { Log.d(TAG, String.format("httpGet.setHeader(%s, %s)", header.getKey(), header.getValue())); } } } try { response = httpClient.execute(httpGet); mHttpResponseCode = response.getStatusLine().getStatusCode(); } catch (Exception e) { Log.w(TAG, "ex:" + e.getMessage() + " |httpClient.execute step1 - " + mHttpResponseCode); } // we assume that the response body contains the error message try { ret = EntityUtils.toString(response.getEntity()); mHttpResponseCode = response.getStatusLine().getStatusCode(); } catch (IOException e) { //Log.e(TAG, e.getMessage()); Log.w(TAG, "ex:" + e.getMessage() + " |step2 - mHttpResponseCode: " + mHttpResponseCode); } if (AppContext.isDebugMode()) Log.d(TAG, "mHttpResponseCode: " + mHttpResponseCode); return ret; } public String webDelete(String methodName, Bundle params) { Map<String, String> reqParams = new HashMap<String, String>(); // TODO: do checks to avoid fups! for (String key : params.keySet()) { // reqParams.put(key, params.getString(key)); reqParams.put(key, params.get(key) + ""); } return webDelete(methodName, reqParams); } public String webDelete(String methodName, Map<String, String> params) { String deleteUrl; if (methodName.startsWith(webServiceUrl)) { deleteUrl = methodName; } else { deleteUrl = webServiceUrl + methodName; } int i = 0; for (Map.Entry<String, String> param : params.entrySet()) { if (i == 0) { deleteUrl += "?"; } else { deleteUrl += "&"; } try { deleteUrl += param.getKey() + "=" + URLEncoder.encode(param.getValue(), "UTF-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } i++; } httpDelete = new HttpDelete(deleteUrl); if (AppContext.isDebugMode()) Log.d(TAG, "WebDeleteURL: " + deleteUrl); for (RequestHeader header : headers) { if (header != null) { httpDelete.setHeader(header.getKey(), header.getValue()); if (AppContext.isDebugMode()) { Log.d(TAG, String.format("httpDelete.setHeader(%s, %s)", header.getKey(), header.getValue())); } } } try { response = httpClient.execute(httpDelete); mHttpResponseCode = response.getStatusLine().getStatusCode(); } catch (Exception e) { Log.w(TAG, "ex:" + e.getMessage() + " |httpClient.execute step1 - " + mHttpResponseCode); } // we assume that the response body contains the error message try { ret = EntityUtils.toString(response.getEntity()); mHttpResponseCode = response.getStatusLine().getStatusCode(); } catch (IOException e) { //Log.e(TAG, e.getMessage()); Log.w(TAG, "ex:" + e.getMessage() + " |step2 - mHttpResponseCode: " + mHttpResponseCode); } if (AppContext.isDebugMode()) Log.d(TAG, "mHttpResponseCode: " + mHttpResponseCode); return ret; } // use this method for plain POST only! public String webPost(String methodName, Bundle params) throws MalformedURLException, IOException { // random string as boundary for multi-part http post String strBoundary = "3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f"; String endLine = "\r\n"; OutputStream os; ret = null; String postUrl = webServiceUrl + methodName; if (AppContext.isDebugMode()) Log.d(TAG, "POST URL: " + postUrl); HttpURLConnection conn = (HttpURLConnection) new URL(postUrl).openConnection(); /*for (RequestHeader header : headers) { if (header != null) { conn.setRequestProperty(header.getKey(), header.getValue()); if (AppContext.isDebugMode()) { Log.d(TAG, String.format("httpDelete.setHeader(%s, %s)", header.getKey(), header.getValue()) ); } } }*/ //if ( TextUtils.isEmpty(conn.getRequestProperty("User-Agent")) ) { conn.setRequestProperty("User-Agent", System.getProperties().getProperty("http.agent") + " WareNinjaAndroidSDK"//"com.wareninja.android.mayormonster"//CommonUtils.getMyUserAgent(mContext)// ); //} Bundle dataparams = new Bundle(); for (String key : params.keySet()) { byte[] byteArr = null; try { byteArr = (byte[]) params.get(key); } catch (Exception ex1) { } if (byteArr != null) dataparams.putByteArray(key, byteArr); } conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + strBoundary); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestProperty("Connection", "Keep-Alive"); appendRequestHeaders(conn, headers); conn.connect(); os = new BufferedOutputStream(conn.getOutputStream()); os.write(("--" + strBoundary + endLine).getBytes()); os.write((CommonUtils.encodePostBody(params, strBoundary)).getBytes()); os.write((endLine + "--" + strBoundary + endLine).getBytes()); if (!dataparams.isEmpty()) { for (String key : dataparams.keySet()) { os.write(("Content-Disposition: form-data; filename=\"" + key + "\"" + endLine).getBytes()); os.write(("Content-Type: content/unknown" + endLine + endLine).getBytes()); os.write(dataparams.getByteArray(key)); os.write((endLine + "--" + strBoundary + endLine).getBytes()); } } os.flush(); String response = ""; try { response = CommonUtils.read(conn.getInputStream()); //mHttpResponseCode = conn.getResponseCode(); } catch (FileNotFoundException e) { // Error Stream contains JSON that we can parse to a FB error response = CommonUtils.read(conn.getErrorStream()); } if (AppContext.isDebugMode()) Log.d(TAG, "POST response: " + response); return response; } public InputStream getHttpStream(String urlString) throws IOException { InputStream in = null; int response = -1; URL url = new URL(urlString); URLConnection conn = url.openConnection(); if (!(conn instanceof HttpURLConnection)) throw new IOException("Not an HTTP connection"); try { HttpURLConnection httpConn = (HttpURLConnection) conn; httpConn.setAllowUserInteraction(false); httpConn.setInstanceFollowRedirects(true); httpConn.setRequestMethod("GET"); httpConn.connect(); mHttpResponseCode = response = httpConn.getResponseCode(); if (response == HttpURLConnection.HTTP_OK) { in = httpConn.getInputStream(); } } catch (Exception e) { throw new IOException("Error connecting"); } // end try-catch return in; } public void clearCookies() { httpClient.getCookieStore().clear(); } public void abort() { try { if (httpClient != null) { System.out.println("Abort."); httpPost.abort(); } } catch (Exception e) { // System.out.println("Your App Name Here" + e); } } }