0

嗨,我正在我的应用程序中使用肥皂服务。肥皂服务适用于 mozilla firefox REST 客户端和 SOA 客户端。

请求正文:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://tempuri.org/IService/GetData</a:Action>
</s:Header>
<s:Body>
<GetData xmlns="http://tempuri.org/"><value>Hello</value></GetData>
</s:Body>
</s:Envelope>

代码:

private final String raw1 = "<s:Envelope xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:a=\"http://www.w3.org/2005/08/addressing\">" +
            "<s:Header>" +
            "<a:Action s:mustUnderstand=\"1\">http://tempuri.org/IService/GetData</a:Action>" +
            "</s:Header>" +
            "<s:Body>" +
            "<GetData xmlns=\"http://tempuri.org/\">" +
            "<value>Hello</value>" +
            "</GetData>" +
            "</s:Body>" +
            "</s:Envelope>";
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(URL);
post.setHeader("Content-type", "application/soap+xml");
post.setHeader("charset", "utf-8");
try {
    post.setEntity(new StringEntity(raw1, "UTF8"));
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
try {
    HttpResponse response = client.execute(post);
    Log.d("test", ""+response.getStatusLine());
    InputStream is = response.getEntity().getContent();
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String str, res = ""; 
    while((str = br.readLine()) != null) {
        res += str;
    }
    br.close();
    is.close();
    Log.d("test", ""+res);
} catch(Exception e) {
    e.printStackTrace();
}

如果我使用这个原始请求正文并手动发布 http 帖子,我可以在我的 android 应用程序中访问该服务,但是如果我使用 ksoap2

private String NAME_SPACE = "http://tempuri.org";
private String METHOD_NAME = "GetData";
private final String URL =  "http://example.amazonaws.com/PresenceServices/Service.svc";
private final String SOAP_ACTION = "http://tempuri.org/IService/GetData";

SoapObject request = new SoapObject(NAME_SPACE, METHOD_NAME);
request.addProperty("value", "hello");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
    androidHttpTransport.call(SOAP_ACTION, envelope);
    SoapObject response = (SoapObject)envelope.getResponse();
    Log.e("Object response", response.toString());
    return response;
} catch (Exception e) {
    e.printStackTrace();
}

它抛出IOException Http Request Failed Http status 500

请帮助我在 ksoap2 中实现这一点。

4

2 回答 2

0

请找到我关于使用 KSOAP2 在 Android 中使用 SOAP 的教程

希望它会帮助你。

于 2013-06-18T15:41:52.380 回答
0

我认为问题是您没有将标题添加到信封中。(动作标题)

尝试

private Element[] buildHeader(String URL, String SOAP_ACTION) {
    List<Element> headers = new ArrayList<Element>();
    Element action = new Element().createElement(
            "http://www.w3.org/2005/08/addressing", "Action");
    action.addChild(Node.TEXT, SOAP_ACTION);
    action.setAttribute("http://www.w3.org/2005/08/addressing",
            "mustUnderstand", "1");
    headers.add(action);

    int size = headers.size();
    Element[] array = new Element[size];
    for (int i = 0; i < size; i++)
        array[i] = headers.get(i);
    return array;
}

Element[] e = buildHeader(url, SOAP_ACTION);
soapEnvelope.headerOut = e;
于 2013-07-17T11:42:25.313 回答