从android调用Soap webservice

时间:2013-05-04 12:32:36

标签: java android web-services soap

我正在使用以下流程,

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

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

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

URL --->

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请求。我尝试了很多但是无法弄明白。

由于

5 个答案:

答案 0 :(得分:4)

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

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

代替,

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

正如您在网址中看到的请求 - &gt; w3schoools,他们正在使用,

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

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

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

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

答案 1 :(得分:3)

我在c-sharpcorner.com上写了一篇关于如何Call Web Service in Android Using SOAP的文章。

这篇文章帮助了很多人。您也可以下载并运行。我将帮助您了解如何使用SOAP进行Web服务。

修改

查看以下链接。它使用kso​​ap进行复杂的数据处理。

答案 2 :(得分:1)

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

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

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

希望这有帮助!

答案 3 :(得分:1)

我预感到模拟器的Android版本和手机版本不同。

但我的建议很少。使用以下:

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

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

答案 4 :(得分: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();
    }