Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将一堆XML从Android传递到RESTful方法,而不将其放入URL?_Java_Xml_Rest_Url Routing_Frombodyattribute - Fatal编程技术网

Java 如何将一堆XML从Android传递到RESTful方法,而不将其放入URL?

Java 如何将一堆XML从Android传递到RESTful方法,而不将其放入URL?,java,xml,rest,url-routing,frombodyattribute,Java,Xml,Rest,Url Routing,Frombodyattribute,我知道如何在C#中实现这一点,事实上我写了一篇关于它的技巧,但我不知道如何在Java/Android中实现它 到目前为止,我的代码是: protected void doInBackground(String... params) { String URLToCall = "http://10.0.2.2:28642/api/DeliveryItems/PostArgsAndXMLFileAsStr"; String result = ""; String stringi

我知道如何在C#中实现这一点,事实上我写了一篇关于它的技巧,但我不知道如何在Java/Android中实现它

到目前为止,我的代码是:

protected void doInBackground(String... params) {
    String URLToCall = "http://10.0.2.2:28642/api/DeliveryItems/PostArgsAndXMLFileAsStr";
    String result = "";
    String stringifiedXML = params[0];
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(URLToCall);
    List<NameValuePair> nvp = new ArrayList<NameValuePair>();
    nvp.add(new BasicNameValuePair("serialNum", "42"));
    nvp.add(new BasicNameValuePair("siteNum", "Some Site"));
    try {
        httppost.setEntity(new UrlEncodedFormEntity(nvp));
        HttpResponse response = httpclient.execute(httppost);
        result = response.toString();
    } catch (ClientProtocolException e) {
        Log.e("ClientProtocolException", e.toString());
    } catch (UnsupportedEncodingException uex) {
        Log.e("UnsupportedEncodingException", uex.toString());
    } catch (IOException iox) {
        Log.e("IOException", iox.toString());
    }
}
如您所见,我在URL中传递了两个(小的)VAL(serialNum和siteNum),但是我如何传递stringifiedXML(它相当大,如果塞进URL中,看起来会比满满一堆粉刺状的笨蛋丑陋17倍)

C#客户机代码使用WebClient,但我不知道Java中是否有分析类

更新 作为对阿菲(希望他不是德国人)的回应,根据我所看到的:

那么,你是说,我应该这样设置,而不是我上面所说的:

String result = "";
String stringifiedXML = params[0];
String serNum = params[1];
String siteNum = params[2];

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(URLToCall);
List<NameValuePair> nvp = new ArrayList<NameValuePair>();
nvp.add(new BasicNameValuePair("stringifiedXML", stringifiedXML));
…使用所有这些调用服务器:

String URLToCall = builder.build().toString();
try {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(URLToCall);
    httppost.setEntity(new UrlEncodedFormEntity(nvp));
    HttpResponse response = httpclient.execute(httppost);
    result = response.toString();
…调用AsyncTask的代码如下:

_postDeliveryItemTask = new PostDeliveryItemTask();
_postDeliveryItemTask.execute(XMLFileAsStr, "42", "some Site");
?

更新2 显然不是,因为代码在到达“
HttpResponse response=httpclient.execute(httppost);
”时记录了以下内容:

04-24 19:35:55.308    1348-1364/hhs.app W/dalvikvm﹕ threadid=12: thread exiting with uncaught exception (group=0xb2b0fba8)
04-24 19:35:55.408    1348-1364/hhs.app E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #2
    Process: hhs.app, PID: 1348
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: java.lang.IllegalArgumentException: Host name may not be null
            at org.apache.http.HttpHost.<init>(HttpHost.java:83)
            at org.apache.http.impl.client.AbstractHttpClient.determineTarget(AbstractHttpClient.java:497)
            at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
            at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
            at hhs.app.RESTfulActivity$PostDeliveryItemTask.doInBackground(RESTfulActivity.java:161)
            at hhs.app.RESTfulActivity$PostDeliveryItemTask.doInBackground(RESTfulActivity.java:131)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
04-24 19:35:55.558    1348-1348/hhs.app I/MainActivity﹕ onRestart
04-24 19:35:55.558    1348-1348/hhs.app I/MainActivity﹕ OnStart
04-24 19:35:55.568    1348-1348/hhs.app I/MainActivity﹕ onResume
04-24 19:35:55.718    1348-1348/hhs.app W/EGL_emulation﹕ eglSurfaceAttrib not implemented
04-2419:35:55.3081348-1364/hhs.app W/dalvikvm﹕ threadid=12:线程以未捕获异常退出(组=0xb2b0fba8)
04-24 19:35:55.408 1348-1364/hhs.app E/AndroidRuntime﹕ 致命异常:异步任务#2
流程:hhs.app,PID:1348
java.lang.RuntimeException:执行doInBackground()时出错
在android.os.AsyncTask$3.done(AsyncTask.java:300)
位于java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
位于java.util.concurrent.FutureTask.setException(FutureTask.java:222)
位于java.util.concurrent.FutureTask.run(FutureTask.java:242)
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
运行(Thread.java:841)
原因:java.lang.IllegalArgumentException:主机名不能为空
http.HttpHost.(HttpHost.java:83)
位于org.apache.http.impl.client.AbstractHttpClient.DeterminiteTarget(AbstractHttpClient.java:497)
位于org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
位于org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
在hhs.app.RESTfulActivity$PostDeliveryItemTask.doInBackground(RESTfulActivity.java:161)
在hhs.app.RESTfulActivity$PostDeliveryItemTask.doInBackground(RESTfulActivity.java:131)
在android.os.AsyncTask$2.call(AsyncTask.java:288)
位于java.util.concurrent.FutureTask.run(FutureTask.java:237)
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
运行(Thread.java:841)
04-24 19:35:55.558 1348-1348/hhs.app I/main活动﹕ 重新启动
04-24 19:35:55.558 1348-1348/hhs.app I/main活动﹕ 启动
04-24 19:35:55.568 1348-1348/hhs.app I/main活动﹕ 恢复
04-24 19:35:55.718 1348-1348/hhs.app W/EGL_仿真﹕ 未实现eglSurfaceAttrib
为什么在主机名为“10.0.2.2:28642”时,它会声称“由以下原因引起:java.lang.IllegalArgumentException:主机名可能不为null”,对吗


URLToCall最终成为“
http://10.0.2.2%3A28642%2Fapi/DeliveryItems/PostArgsAndXMLFileAsStr?serialNum=42&siteNum=some%20Site

使用StringEntity而不是FormEntity?您是说StringEntity代表XML,FormEntity代表其他两个参数吗?可能吗?我知道(非常确定)您不能将多个带有[FromBody]装饰/注释的arg传递给Web API…您希望在请求正文中同时包含表单编码数据和xml吗?或者您希望这两个参数位于查询字符串中?您可以使用URI生成器生成URI,以将它们放入查询字符串中,而不是将它们放入请求实体中。+1仅用于Hitchhiker引用,如果您希望将数据作为名为“stringifiedXML”的表单参数输入。要使主体仅为实际的XML,如果要将其自动编组到服务器中的对象中,通常需要使用StringEntity
_postDeliveryItemTask = new PostDeliveryItemTask();
_postDeliveryItemTask.execute(XMLFileAsStr, "42", "some Site");
04-24 19:35:55.308    1348-1364/hhs.app W/dalvikvm﹕ threadid=12: thread exiting with uncaught exception (group=0xb2b0fba8)
04-24 19:35:55.408    1348-1364/hhs.app E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #2
    Process: hhs.app, PID: 1348
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: java.lang.IllegalArgumentException: Host name may not be null
            at org.apache.http.HttpHost.<init>(HttpHost.java:83)
            at org.apache.http.impl.client.AbstractHttpClient.determineTarget(AbstractHttpClient.java:497)
            at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
            at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
            at hhs.app.RESTfulActivity$PostDeliveryItemTask.doInBackground(RESTfulActivity.java:161)
            at hhs.app.RESTfulActivity$PostDeliveryItemTask.doInBackground(RESTfulActivity.java:131)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
04-24 19:35:55.558    1348-1348/hhs.app I/MainActivity﹕ onRestart
04-24 19:35:55.558    1348-1348/hhs.app I/MainActivity﹕ OnStart
04-24 19:35:55.568    1348-1348/hhs.app I/MainActivity﹕ onResume
04-24 19:35:55.718    1348-1348/hhs.app W/EGL_emulation﹕ eglSurfaceAttrib not implemented