2

我正在使用以下过程,

1) 为 SOAP 请求创建一个字符串模板,并在此模板中替换用户在运行时提供的值以创建一个有效的请求。2) 将此字符串包装在 StringEntity 中并将其内容类型设置为 text/xml 3) 在 SOAP 请求中设置此实体。

在 httppost 的帮助下,我发布了请求,

我正在使用来自 w3schools.com 的演示网络服务

网址--->

http://www.w3schools.com/webservices/tempconvert.asmx

我试过的是,

HttpPost httppost = new HttpPost("http://www.w3schools.com/webservices/tempconvert.asmx");          
        StringEntity se;
        try {
            SOAPRequestXML="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tem=\"http://tempuri.org/\"><soapenv:Header/><soapenv:Body><tem:CelsiusToFahrenheit><!--Optional:--><tem:Celsius>30</tem:Celsius></tem:CelsiusToFahrenheit></soapenv:Body></soapenv:Envelope>";
            Log.d("request is ", SOAPRequestXML+"!!!");
            se = new StringEntity(SOAPRequestXML,HTTP.UTF_8);


        se.setContentType("text/xml");  
        httppost.setHeader("Content-Type","application/soap+xml;charset=UTF-8");
        httppost.setEntity(se);  

        HttpClient httpclient = new DefaultHttpClient();
        BasicHttpResponse httpResponse = 
            (BasicHttpResponse) httpclient.execute(httppost);
        HttpEntity resEntity = httpResponse.getEntity();
        t.setText(EntityUtils.toString(resEntity));



        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

我能够在soapui中得到响应,所以代码肯定是错误的,因为在模拟器中我得到了输出,

“服务器无法为请求提供服务,因为媒体类型不受支持”。

我是在 HttpPost 的构造函数中传递了正确的参数,还是发出了正确的 xml 请求。我尝试了很多但无法弄清楚。

谢谢

4

5 回答 5

4

您的代码的唯一问题是您将 Header 设置为,

httppost.setHeader("Content-Type","application/soap+xml;charset=UTF-8");

代替,

httppost.setHeader("Content-Type", "text/xml;charset=UTF-8");

正如您在 -> w3schoools的 URL 中看到的请求,他们正在使用,

Content-Type: text/xml; charset=utf-8

而你没有传递相同的内容类型。所以,它给了你错误,

服务器无法为请求提供服务,因为媒体类型不受支持。

因此,只需更改标题,您将获得所需的响应。

于 2013-05-07T11:37:22.987 回答
3

我在 c-sharpcorner.com上写了一篇关于如何使用 SOAP 在 Android 中调用 Web 服务的文章。

很多人都从那篇文章中得到了帮助。您也可以下载并运行。我将帮助您了解如何将 SOAP 用于 Web 服务。

编辑

看看下面的链接。它使用 ksoap 进行复杂的数据处理。

于 2013-05-07T11:21:05.663 回答
1

我有一种预感,模拟器安卓版和手机版不一样。

但我有几个建议。使用以下:

httppost.setHeader("Accept-Charset","utf-8");
httppost.setHeader("Accept","text/xml,application/text+xml,application/soap+xml");

同样,将内容类型设置为上述所有内容。

于 2013-05-07T11:11:37.917 回答
1

这样 html 表单发布 123 摄氏度。没有 SOAP 或信封,只是工作:)

    try {
        HttpPost httppost = new HttpPost("http://www.w3schools.com/webservices/tempconvert.asmx/CelsiusToFahrenheit");
        StringEntity se = new StringEntity("Celsius=123");
        httppost.setEntity(se);
        httppost.setHeader("Content-Type", "application/x-www-form-urlencoded");
        HttpResponse httpResponse = new DefaultHttpClient().execute(httppost);
        HttpEntity resEntity = httpResponse.getEntity();
        return EntityUtils.toString(resEntity);
    } catch (Exception e) {
        e.printStackTrace();
        return e.getMessage();
    }
于 2013-09-02T21:18:41.150 回答
1

您是否尝试过使用 Android 的 ksoap2 库?

你可以在这里找到它,试一试:

https://code.google.com/p/ksoap2-android/

希望这可以帮助 !

于 2013-05-07T10:59:12.843 回答