0

我们在我正在维护的 GWT 应用程序中发现了一个奇怪的新错误,我不确定它何时成为问题。可能使用新的 Firefox 版本。

我们使用 FormPanel 向服务器发送 POST 请求,基本上就像我在网上看到的许多示例一样。但是由于我们实际上想要一个 PUT 请求,因此隐藏的输入参数之一被命名为“method”,并且具有“put”的值。

现在,当我在 Fiddler 中查看来自 Firefox 的请求时,它正在被转换为带有 QueryString 中所有参数的 GET 请求。在 IE 和 Chrome 中,参数位于 POST 请求的正文中。

我在警报中显示了 FormPanel.getMethod() 的值,在 IE 和 Chrome 中显示字符串“post”,而在 firefox 中显示“object HTMLInputElement”。不幸的是,托管模式调试不适用于此项目。

显然,FormPanel 的 getMethod() 函数返回的是名为 method 的隐藏输入参数,而不是 Firefox 中实际表单的方法。

从技术上讲,我应该避免更改 servlet,因为它来自我们使用的 OpenSource 项目,尽管我发现我可以通过在两端将隐藏输入参数的名称更改为“_method”来解决这个问题。

有没有人见过这样的事情?我在 Google 中找不到任何内容。

更新:我们使用 GWT 2.3 以防万一

4

1 回答 1

0

可以在此处找到一些见解大多数 Web 浏览器中是否提供 PUT、DELETE、HEAD 等方法? 我还建议使用 XMLHttpRequest。在这种情况下,您 [很可能] 不必在服务器端进行任何更改。

如果您使用提交按钮,您可以在其 clickHandler 函数中编写:

submitMyForm(yourTextBox.getText(), self); 
// self - is the instance of main class (named UploadForm here), needs to be passed here for future reference

然后是更多(您可以根据需要进行调整):

private native void submitMyForm(String text, UploadForm handler)/*-{
   var fd = new FormData();
   fd.append("textValue", text);

   var xhr = new XMLHttpRequest();
   var upload = xhr.upload;

   readyStateChangeHandler = function () {
      if (xhr.readyState == 4) {
         if (xhr.status == 200) {
           var serverResponse = eval(xhr.responseText); // optional               
           handler.@com.project.UploadForm::onUploadIsDone(Lcom/google/gwt/core/client/JavaScriptObject;)(serverResponse);
         } else {
           handler.@com.project.UploadForm::onUploadFailed(I)(status);
         }
      }
   };

   xhr.onreadystatechange = readyStateChangeHandler;
   xhr.open("PUT", yourActionUrlHere);
   xhr.send(formData);
}-*/;
于 2012-09-19T00:01:24.823 回答