Inspired by someone's example I don't remember  where I've found it.
This method works only with GET


Example:

CrossSiteJsonRequestUtil.INSTANCE.doFetchURL("www.test.com",
                "callbackmethodname", new AsyncCallback<JSONObject>() {

                    @Override
                    public void onFailure(Throwable caught) {
                        // TODO

                    }

                    @Override
                    public void onSuccess(JSONObject result) {
                        // TODO

                    }

                });

import java.util.HashMap;
import java.util.Map;

import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.user.client.rpc.AsyncCallback;


public class CrossSiteJsonRequestUtil {

    public static CrossSiteJsonRequestUtil INSTANCE = new
CrossSiteJsonRequestUtil();

    private Map<String, AsyncCallback<JSONObject>> callbacks = new
HashMap<String, AsyncCallback<JSONObject>>();

    private int curIndex = 0;

    private static final String CALLBACK_PARAM_NAME = "callback";

    public void doFetchURL(String baseUrl,
            AsyncCallback<JSONObject> responseHandler) {
        doFetchURL(baseUrl, CALLBACK_PARAM_NAME, responseHandler);
    }

    public void doFetchURL(String baseUrl, String callbackParamName,
            AsyncCallback<JSONObject> responseHandler) {
        String callbackName = reserveCallback(responseHandler);
        setup(callbackName);

        char sep;
        if (baseUrl.contains("?")) {
            sep = '&';
        } else {
            sep = '?';
        }

        addScript(callbackName, baseUrl + sep + callbackParamName + "="
                + callbackName);


    }

    private void setup(String callback) {
        setup(this, callback);
    }

    private String reserveCallback(AsyncCallback<JSONObject>
responseHandler) {
        while (true) {
            if (!callbacks.containsKey("__gwt_callback" + curIndex)) {
                callbacks.put("__gwt_callback" + curIndex, responseHandler);
                return "__gwt_callback" + curIndex++;
            }
        }
    }

    private native static void setup(CrossSiteJsonRequestUtil
instance,
            String callback) /*-{
        window[callback] = function(someData) {
          instan...@crosssitejsonrequestutil::handle(Lcom/google/gwt/
core/client/JavaScriptObject;Ljava/lang/String;)(someData,callback);
          var scriptEl = document.getElementById(callback);
          document.getElementsByTagName("body")[0].removeChild
(scriptEl);
        window[callback] =null;
        }
    }-*/;

    private native void addScript(String uniqueId, String url) /*-{
        var elem = document.createElement("script");
        elem.setAttribute("language", "JavaScript");
        elem.setAttribute("src", url);
         elem.setAttribute("id", uniqueId);
        document.getElementsByTagName("body")[0].appendChild(elem);
    }-*/;

    @SuppressWarnings("unused")
    private void handle(JavaScriptObject jso, String callback) {
        JSONObject jsonObject = null;
        AsyncCallback<JSONObject> responseHandler = callbacks.get(callback);
        try {
            jsonObject = new JSONObject(jso);
        } catch (RuntimeException e) {
            responseHandler.onFailure(e);
        }
        if (jsonObject != null) {
            responseHandler.onSuccess(jsonObject);
        }

    }


}

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/Google-Web-Toolkit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to