6

ジャージー リソースに対して JavaScript を使用してフォーム データを投稿しようとしています。これがJavaScriptです:

            var form = document.getElementById('form');
            var formdata = new FormData(form);

            if (window.XMLHttpRequest)
              {// code for IE7+, Firefox, Chrome, Opera, Safari
              xmlhttp=new XMLHttpRequest();
              }
            else
              {// code for IE6, IE5
              xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
              }
            xmlhttp.onreadystatechange=function()
              {
              if (xmlhttp.readyState==4 && xmlhttp.status==200)
                {
                    document.getElementById("xmlTextBox").innerHTML=xmlhttp.responseText;
                }
              }
            xmlhttp.open("POST", "PostXml", true);
            xmlhttp.setRequestHeader('Content-Type', 'multipart/form-data');
            xmlhttp.setRequestHeader("Content-length", formdata.length);
            xmlhttp.setRequestHeader("Connection", "close");
            xmlhttp.send(formdata);

Jersey リソースは次のようになります。

@Path("/Resource")
public class MyClass {

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.TEXT_XML)
public String postXML(@FormDataParam("param1") String param1, 
@FormDataParam("param2") String param2){

return "test";

}

実際のバージョンには、より多くのパラメーターと完全なコードが含まれていますが、注釈は同じです。これにより、Tomcat を介して実行すると、次の例外が生成されます。

java.lang.NullPointerException
    at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.unquoteMediaTypeParameters(MultiPartReaderClientSide.java:227)
    at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readMultiPart(MultiPartReaderClientSide.java:154)
    at com.sun.jersey.multipart.impl.MultiPartReaderServerSide.readMultiPart(MultiPartReaderServerSide.java:80)
    at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:144)
    at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:82)
    at com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:488)
    at com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:552)

例外を生成したソースを見ると、パラメーターが通過していないように見えます。

224     for (final String parameterName : parameters) {
225         String parameterValue = mediaType.getParameters().get(parameterName);
226
227         if (parameterValue.startsWith("\"")) {
228             parameterValue = parameterValue.substring(1, parameterValue.length() - 1);
229             unquotedParams.put(parameterName, parameterValue);
230         }
231     }

Firebug を使用してトレースを行ったところ、javascript を使用すると、単純な HTML 投稿と比較して、名前/値が異なって表示されます。HTML 投稿のトレースでは、コンテンツ タイプがアップロード ストリームで返されます。

Request Headers From Upload Stream
Content-Length  1756
Content-Type    multipart/form-data; boundary=---------------------------1523409566516443041527622966

しかし、javascript は単なる標準的な投稿か何かのように見えますか? マルチフォームデータの投稿をjavascriptで複製する方法はありますか??

私は物事を通り抜けているように見えるので、何かアイデアはありますか? また、通常の HTML フォームの投稿を使用してこれを試してみましたが、正常に動作するため、javascript に関連している必要があります。

4

1 に答える 1

6

それらを削除しますsetRequestHeader

var form = document.getElementById('form');
var formdata = new FormData(form);

var xmlhttp=new XMLHttpRequest();
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        document.getElementById("xmlTextBox").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("POST", "PostXml", true);
xmlhttp.send(formdata);

http://jsfiddle.net/8NWB7/動作中
http://jsfiddle.net/8NWB7/1/動作していない

于 2013-05-13T22:02:30.433 に答える