diff --git a/src/com/androidquery/AbstractAQuery.java b/src/com/androidquery/AbstractAQuery.java index bc213bab..7f54f5de 100644 --- a/src/com/androidquery/AbstractAQuery.java +++ b/src/com/androidquery/AbstractAQuery.java @@ -2159,8 +2159,44 @@ public T put(String url, JSONObject jo, Class type, AjaxCallback callb } - - + + /** + * Ajax HTTP patch. + * + * The handler signature must be (String url, object, AjaxStatus status) + * + * @param url url + * @param contentHeader Content header + * @param entity entity + * @param type reponse type + * @param callback callback method name + * @return self + */ + public T patch(String url, String contentHeader, HttpEntity entity, Class type, AjaxCallback callback) { + callback.url(url).type(type).method(AQuery.METHOD_PATCH).header("Content-Type", contentHeader).param(AQuery.POST_ENTITY, entity); + return ajax(callback); + } + + /** + * Ajax HTTP patch. + * + * The handler signature must be (String url, object, AjaxStatus status) + * + * @param url url + * @param jo JSON object + * @param type reponse type + * @param callback callback method name + * @return self + */ + public T patch(String url, JSONObject jo, Class type, AjaxCallback callback) { + try { + StringEntity entity = new StringEntity(jo.toString(), "UTF-8"); + return patch(url, "application/json", entity, type, callback); + } catch (UnsupportedEncodingException e) { + throw new IllegalArgumentException(e); + } + } + /** * Ajax HTTP delete. diff --git a/src/com/androidquery/callback/AbstractAjaxCallback.java b/src/com/androidquery/callback/AbstractAjaxCallback.java index 1b1911c5..6547946a 100644 --- a/src/com/androidquery/callback/AbstractAjaxCallback.java +++ b/src/com/androidquery/callback/AbstractAjaxCallback.java @@ -101,6 +101,7 @@ import com.androidquery.util.AQUtility; import com.androidquery.util.Common; import com.androidquery.util.Constants; +import com.androidquery.util.HttpPatch; import com.androidquery.util.PredefinedBAOS; import com.androidquery.util.Progress; import com.androidquery.util.XmlDom; @@ -1364,7 +1365,9 @@ private void network() throws IOException{ }else{ if(isMultiPart(params)){ httpMulti(url, params, status); - }else{ + }else if (Constants.METHOD_PATCH == method){ + httpPatch(url, params, status); + } else { httpPost(url, params, status); } @@ -1495,8 +1498,17 @@ private void httpPut(String url, Map params, AjaxStatus status) httpEntity(url, req, params, status); } - - + + private void httpPatch(String url, Map params, AjaxStatus status) throws ClientProtocolException, IOException{ + + AQUtility.debug("patch", url); + + HttpEntityEnclosingRequestBase req = new HttpPatch(url); + + httpEntity(url, req, params, status); + + } + private void httpEntity(String url, HttpEntityEnclosingRequestBase req, Map params, AjaxStatus status) throws ClientProtocolException, IOException{ //This setting seems to improve post performance diff --git a/src/com/androidquery/util/Constants.java b/src/com/androidquery/util/Constants.java index 30ef0cef..5c51b71f 100644 --- a/src/com/androidquery/util/Constants.java +++ b/src/com/androidquery/util/Constants.java @@ -44,7 +44,8 @@ public interface Constants { public static final int METHOD_DELETE = 2; public static final int METHOD_PUT = 3; public static final int METHOD_DETECT = 4; - + public static final int METHOD_PATCH = 5; + public static final int TAG_URL = 0x40FF0001; public static final int TAG_SCROLL_LISTENER = 0x40FF0002; public static final int TAG_LAYOUT = 0x40FF0003; diff --git a/src/com/androidquery/util/HttpPatch.java b/src/com/androidquery/util/HttpPatch.java new file mode 100644 index 00000000..77aa699d --- /dev/null +++ b/src/com/androidquery/util/HttpPatch.java @@ -0,0 +1,16 @@ +package com.androidquery.util; + +import org.apache.http.client.methods.HttpPost; + +public class HttpPatch extends HttpPost { + public static final String METHOD_PATCH = "PATCH"; + + public HttpPatch(final String url) { + super(url); + } + + @Override + public String getMethod() { + return METHOD_PATCH; + } +}