Web開発フレームワークとしてGWTを使用しています。 RESTサービスにGWTクライアントコードからアクセスする必要があります。また、これらのサービスの応答形式であるJSON(またはXML)を解析する必要があります。この問題に最適な方法はどれですか?
前もって感謝します。
REST標準のGWTを使用してサービスを呼び出す RequestBuilder
(または JsonpRequestBuilder
必要な場合別のドメインのサービスを呼び出します)。
JSON応答文字列を使用すると、JSONParser.parseStrict(jsonString)
を呼び出してJSONValue
を取得できます。これは、JSONObject
、JSONArray
などにすることができます。これはすべて利用可能です このパッケージ 。
プロキシサービスインターフェースを作成することで、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も備えています。
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には必要ありません)。必要に応じてサービスを利用できます。
以下のコードソースは、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();
}
これについては、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);
}