web-dev-qa-db-ja.com

GWTからRESTFULサービスを呼び出す方法は?

Web開発フレームワークとしてGWTを使用しています。 RESTサービスにGWTクライアントコードからアクセスする必要があります。また、これらのサービスの応答形式であるJSON(またはXML)を解析する必要があります。この問題に最適な方法はどれですか?

前もって感謝します。

24
ovunccetin

REST標準のGWTを使用してサービスを呼び出す RequestBuilder (または JsonpRequestBuilder 必要な場合別のドメインのサービスを呼び出します)。

JSON応答文字列を使用すると、JSONParser.parseStrict(jsonString)を呼び出してJSONValueを取得できます。これは、JSONObjectJSONArrayなどにすることができます。これはすべて利用可能です このパッケージ

17
Jason Hall

プロキシサービスインターフェースを作成することで、GWTアプリケーションで RestyGWT を使用してRestful Webサービスを簡単に呼び出すことができます。

import javax.ws.rs.POST;
...
public interface PizzaService extends RestService {
    @POST
    public void order(PizzaOrder request, 
                      MethodCallback<OrderConfirmation> callback);
}

または、サービスインターフェースを作成する手間をかけたくない場合:

Resource resource = new Resource( GWT.getModuleBaseURL() + "pizza-service");

JSONValue request = ...

resource.post().json(request).send(new JsonCallback() {
    public void onSuccess(Method method, JSONValue response) {
        System.out.println(response);
    }
    public void onFailure(Method method, Throwable exception) {
        Window.alert("Error: "+exception);
    }
});

また、Java Object to JSONをエンコードおよびデコードするためのNice APIも備えています。

8
Saeed Zarinfam

RequestBuilderは、HTTPリクエストを行うための低レベルのアプローチです。

Turbo GWT HTTP は、クライアント/サーバー通信を管理し、リクエストをスムーズに実行するための便利なAPIです。

RESTスタイルの通信に適しています。次の例を検討してください。

Request request = requestor.request(Void.class, Book.class)
        .path("server").segment("books").segment(1)
        .get(new AsyncCallback<Book>() {
            @Override
            public void onFailure(Throwable caught) {

            }

            @Override
            public void onSuccess(Book result) {
                Window.alert("My book title: " + result.getTitle());
            }
});

RESTサービスを呼び出す前にマップする必要はありません(概念的にはRPC通信には必要ですが、RESTには必要ありません)。必要に応じてサービスを利用できます。

2
reinert

REST services:checkout gwt-rest の場合。

GWTでのJSONサポートの場合: ここ を参照

2
z00bs

以下のコードソースは、RequestBuilderを使用して、GWTを使用してRESTFUL Webサービスにリクエストをポストしました

JSONObject jsonObject = new JSONObject();

email = (String) vslLoginView.getFieldUserEmailID().getValue();
password = (String) vslLoginView.getFieldUserPasword().getValue();

jsonObject.put("email", new JSONString(email));
jsonObject.put("password", new JSONString(password));
System.out.println("Password at Presenter:"
    + jsonObject.get("password"));
RequestBuilder builder = new RequestBuilder(RequestBuilder.POST,
    RecursosURL.LOGIN.toString()/*your restful webservice url */ + "/authenticateuser");
builder.setHeader("Content-Type", "application/json");
try {
    SC.showPrompt(constants.wait());
    builder.sendRequest(jsonObject.toString(),
        new SamrtWebRequestCallback(false, false, false, false) {

            @Override
            public void onSuccess(Response response) {
                // Recevie response of logged user data from  restful webservice
                JSONObject jsonOnlineUser = JSONParser.parse(
                    response.getText()).isObject();
                UserTO userTO = ConverterUser
                    .converterJSONParaUser(jsonOnlineUser);
                String primaryAccess = jsonOnlineUser.get(
                    "primaryAccess").isString().stringValue();

                HashMap<String, Object> parameters = new HashMap<String, Object>();
                if (primaryAccess.equals("S")) {

                    parameters.put("email", email);
                    parameters.put("password", password);
                    parameters.put("id", jsonOnlineUser.get("id")
                        .isString().stringValue());

                } else {

                    parameters.put("email", email);
                    handlerManager.fireEvent(new EvtIrParaPage(
                        Pages.PAGE_INICIAL, parameters));
                }

            }

            @Override
            protected void onErrorCallbackAdapter(Response response) {
                vslLoginView.getLabelMsgErro().setContents(
                    response.getText());
                vslLoginView.getLabelMsgErro().setVisible(true);
            }
        });

} catch (RequestException e) {
    e.printStackTrace();
}
2
user4423251

これについては、GWT JSNIの使用にフォールバックする方が簡単だと思います。

たとえば、JSONサービスを呼び出してユーザーの国コードを取得します。

public static native void getCountryCode(Loaded<String> countryCode) /*-{
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            var jsonObj = JSON.parse(xhttp.responseText);
            [email protected]::data(*)(jsonObj.country_code);
        }
    };
    xhttp.open("GET", "https://api.ipdata.co/", true);
    xhttp.send();
}-*/;

「Loaded」は次のとおりです。

package mypackage;

public interface Loaded<T> {
    public void data(T data);
}
0
Craigo