【问题标题】:GWT request payload understandingGWT 请求负载理解
【发布时间】:2015-06-28 23:27:24
【问题描述】:

如果你在下面看,当我在我的应用程序中进行 RPC 调用时,我的有效负载将发送到服务器

7|0|14|http://domain.com/ager-online/tracklay/|7FCCBC6F7B44BB2BEB84AAB8B47DB2E4|com.d.g4.consumer.w.client.rpcservice.ConsumerService|placeService|java.util.List|java.util.ArrayList/4159755760|co.g.consumer.wager.client.model.ConsumernseType/2494043886|java.lang.Double/858496421|java.lang.Integer/3438268394|2|1|WIN|java.lang.Long/4227064769|java.util.Date/3385151746|1|2|3|4|1|5|6|1|7|8|2|8|2|9|1|10|11|11|12|13|Co3|14|**Uzc1OKs**|9|309158|-5|

我知道它正在被序列化并向服务器发送数据。我想知道的是中间的键。像 Uzc1OKs 我在请求中标记了它们。

它们到底是什么?

有什么想法吗?

【问题讨论】:

  • 请添加您正在调用的远程过程的方法签名。
  • 在问这个问题之前,做过任何研究吗? GWT 是开源的,应该很容易追查“罪魁祸首”——检查 GWT 编译器从 *Async 接口生成的类,查看那里使用了哪些类,然后跟踪直到找到序列化方案。或谷歌周围...

标签: java gwt rpc


【解决方案1】:

【讨论】:

    【解决方案2】:

    您可以在客户端通过以下方式使用GWT RPC

    创建服务

    private void refreshWatchList() {
        final double MAX_PRICE = 100.0; // $100.00
        final double MAX_PRICE_CHANGE = 0.02; // +/- 2%
    
        StockPrice[] prices = new StockPrice[stocks.size()];
        for (int i = 0; i < stocks.size(); i++) {
          double price = Random.nextDouble() * MAX_PRICE;
          double change = price * MAX_PRICE_CHANGE
              * (Random.nextDouble() * 2.0 - 1.0);
    
          prices[i] = new StockPrice(stocks.get(i), price, change);
        }
    
        updateTable(prices);
      }
    

    定义服务

    @RemoteServiceRelativePath("stockPrices")
    public interface StockPriceService extends RemoteService {
    
          StockPrice[] getPrices(String[] symbols);
    }
    

    实现服务

    public class StockPriceServiceImpl extends RemoteServiceServlet implements StockPriceService {
    
        public StockPrice[] getPrices(String[] symbols) {
            // TODO Auto-generated method stub
            return null;
        }
    }
    

    从客户端调用服务并进行远程过程调用:

    private ArrayList<String> stocks = new ArrayList<String>();
    private StockPriceServiceAsync stockPriceSvc = GWT.create(StockPriceService.class);
    
    private void refreshWatchList() {
        // Initialize the service proxy.
        if (stockPriceSvc == null) {
          stockPriceSvc = GWT.create(StockPriceService.class);
        }
    
         // Set up the callback object.
        AsyncCallback<StockPrice[]> callback = new AsyncCallback<StockPrice[]>() {
          public void onFailure(Throwable caught) {
            // TODO: Do something with errors.
          }
    
          public void onSuccess(StockPrice[] result) {
            updateTable(result);
          }
        };
    
         // Make the call to the stock price service.
        stockPriceSvc.getPrices(stocks.toArray(new String[0]), callback);
    }
    

    这基本上就是 RPC 所做的。

    你的

    中间的键

    可能是您的对象序列化的结果。如果您不喜欢,也可以使用 GWT RequestBuilder

    RequestBuilder requestBuilder = new RequestBuilder(requestMethod, url); 
    requestBuilder.setHeader("Content-Type", "application/json");
    requestBuilder.setRequestData(bodyString);
    requestBuilder.setCallback(new RequestCallback() {
    
          @Override
          public void onResponseReceived(Request request, Response response) {
            callback.onResponse(response.getStatusCode(), response.getText());
          }
    
          @Override
          public void onError(Request request, Throwable exception) {
            callback.onError(new Exception(exception));
          }
        });
    
        try {
          requestBuilder.send();
        }
        catch(RequestException ex) {
          callback.onError(ex);
        }
    

    使用 RequestBuilder 时,您可以更好地控制格式和传输的内容。

    【讨论】:

      【解决方案3】:

      GWT 默认使用协议缓冲区作为序列化机制。你可以在这里找到更多:Protocol Buffers

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多