android - 获取 java.io.IOException : HTTP request failed, HTTP 状态 : 404 in ksoap2 while passing xml data to soap1. 2 android

标签 android http-status-code-404 ksoap2 soap1.2

我必须通过

<?xml version='1.0' encoding='utf-8' ?>
<hello><username><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0f7b6a7c7b4f7b6a7c7b216c6062" rel="noreferrer noopener nofollow">[email protected]</a></username>
<password>test</password></hello>

Wsdl

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://tempuri.org/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" name="SilentManagerAPI" targetNamespace="http://tempuri.org/">
<wsp:Policy wsu:Id="WSHttpBinding_ISilentManagerAPI_policy">
<wsp:ExactlyOne>
<wsp:All>
<wsaw:UsingAddressing/>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
<wsdl:types>
<xsd:schema targetNamespace="http://tempuri.org/Imports">
<xsd:import schemaLocation="http://myurl.com/Service.svc?xsd=xsd0" namespace="http://tempuri.org/"/>
<xsd:import schemaLocation="http://myurl.com/Service.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="ISilentManagerAPI_Service_InputMessage">
<wsdl:part name="parameters" element="tns:Service"/>
</wsdl:message>
<wsdl:message name="ISilentManagerAPI_Service_OutputMessage">
<wsdl:part name="parameters" element="tns:ServiceResponse"/>
</wsdl:message>
<wsdl:portType name="ISilentManagerAPI">
<wsdl:operation name="Service">
<wsdl:input wsaw:Action="http://tempuri.org/ISilentManagerAPI/Service" message="tns:ISilentManagerAPI_Service_InputMessage"/>
<wsdl:output wsaw:Action="http://tempuri.org/ISilentManagerAPI/ServiceResponse" message="tns:ISilentManagerAPI_Service_OutputMessage"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="WSHttpBinding_ISilentManagerAPI" type="tns:ISilentManagerAPI">
<wsp:PolicyReference URI="#WSHttpBinding_ISilentManagerAPI_policy"/>
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="Service">
<soap12:operation soapAction="http://tempuri.org/ISilentManagerAPI/Service" style="document"/>
<wsdl:input>
<soap12:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap12:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SilentManagerAPI">
<wsdl:port name="WSHttpBinding_ISilentManagerAPI" binding="tns:WSHttpBinding_ISilentManagerAPI">
<soap12:address location="http://myurl.com/Service.svc/Service.svc"/>
<wsa10:EndpointReference>
<wsa10:Address>
http://myurl.com/Service.svc/Service.svc
</wsa10:Address>
</wsa10:EndpointReference>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

尝试过的代码:

import android.os.AsyncTask;
import android.os.Bundle;

import android.util.Log;
import android.widget.TextView;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;

import java.io.Writer;

import org.ksoap2.*;
import org.ksoap2.serialization.*;
import org.ksoap2.transport.*;
import org.xmlpull.v1.XmlSerializer;

public class MainActivity extends Activity {

    private static final String METHOD_NAME = "Service"; 
    private static final String NAMESPACE = "http://tempuri.org/"; 
    private static final String URL = "http://myurl.com/Service.svc";
    final String SOAP_ACTION = "http://tempuri.org/ISilentManagerAPI/Service";

    TextView tv;
    StringBuilder sb;
    private XmlSerializer writer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        tv = new TextView(this);
        sb = new StringBuilder();
        new testReq().execute();
        tv.setText(sb.toString());
        setContentView(tv);
    }

    class testReq extends AsyncTask<Void, Void, Void> {
        Dialog dialog;

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            dialog = ProgressDialog.show(MainActivity.this, "Please Wait...",
                    "Testing........");
            dialog.setCancelable(true);
            dialog.setOnCancelListener(new OnCancelListener() {

                @Override
                public void onCancel(DialogInterface dialog) {
                    // TODO Auto-generated method stub
                    cancel(true);
                }
            });

        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            dialog.dismiss();
        }

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            call();
            return null;
        }
    }

    public void call() {
        try {

            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

            PropertyInfo req = new PropertyInfo();
            req.name = "hello";
            req.type = String.class;
            req.setValue("<hello>" + "<username><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="98ecfdebecd8ecfdebecb6fbf7f5" rel="noreferrer noopener nofollow">[email protected]</a></username>"
                    + "<password>test123</password>" + "</hello>");
            request.addProperty(req);

            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                    SoapEnvelope.VER11);
            envelope.dotNet = true;
            envelope.setOutputSoapObject(request);

            HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
            androidHttpTransport.call(SOAP_ACTION, envelope);
            SoapPrimitive result = (SoapPrimitive) envelope.getResponse();

            String resultData = result.toString();
            Log.i("Result", "" + resultData);

            sb.append(resultData + "\n");
        } catch (Exception e) {
            sb.append("Error:\n" + e.getMessage() + "\n");
            e.printStackTrace();
        }

    }
}

我在 AndroidManifest.xml 中使用互联网权限

  <uses-permission android:name="android.permission.INTERNET"/>

输出将类似于

<hello>
  <username>any</username>
  <myoutputdata>
    .
    . return data
    .    
  </myoutputdata>
</silent>

尝试此代码后出现异常

LogCat

08-01 13:27:53.240: W/System.err(10915): java.io.IOException: HTTP request failed, HTTP status: 404
08-01 13:27:53.300: W/System.err(10915):    at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:195)
08-01 13:27:54.370: W/System.err(10915):    at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:116)
08-01 13:27:54.390: W/System.err(10915):    at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:111)
08-01 13:27:54.410: W/System.err(10915):    at com.example.testeset.MainActivity.call(MainActivity.java:105)
08-01 13:27:54.440: W/System.err(10915):    at com.example.testeset.MainActivity$testReq.doInBackground(MainActivity.java:80)
08-01 13:27:54.460: W/System.err(10915):    at com.example.testeset.MainActivity$testReq.doInBackground(MainActivity.java:1)
08-01 13:27:54.470: W/System.err(10915):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
08-01 13:27:54.480: W/System.err(10915):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
08-01 13:27:54.490: W/System.err(10915):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
08-01 13:27:54.500: W/System.err(10915):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
08-01 13:27:54.500: W/System.err(10915):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
08-01 13:27:54.500: W/System.err(10915):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
08-01 13:27:54.500: W/System.err(10915):    at java.lang.Thread.run(Thread.java:856)

这里我遇到异常:

androidHttpTransport.call(SOAP_ACTION, envelope);

最佳答案

如果仍然相关..

首先,您应该将URL更改为http://myurl.com/Service.svc/Service.svc。它将解决 404 错误。

你应该进一步改变

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);

此外,您应该添加 wsa:Towsa:Action header ,如下所示:

        Element e = new Element();
        e.setName("To");
        e.setNamespace("http://www.w3.org/2005/08/addressing");
        e.addChild(Node.TEXT,"http://myurl.com/Service.svc/Service.svc");

        Element e1 = new Element();
        e1.setName("Action");
        e1.setNamespace("http://www.w3.org/2005/08/addressing");
        e1.addChild(Node.TEXT,"http://tempuri.org/ISilentManagerAPI/Service");

        envelope.headerOut = new Element[]{e,e1};

希望对您有所帮助。

编辑:尝试将req更改为:

 PropertyInfo req = new PropertyInfo();
        req.name = "xmlstring";
        req.namespace=NAMESPACE;
        req.type = String.class;
        req.setValue("<hello><username><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2a5e4f595e6a5e4f595e04494547" rel="noreferrer noopener nofollow">[email protected]</a></username><password>test</password></hello>");
        request.addProperty(req);

即将 req.name 更改为 xmlstring 并设置命名空间。

关于android - 获取 java.io.IOException : HTTP request failed, HTTP 状态 : 404 in ksoap2 while passing xml data to soap1. 2 android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17987076/

相关文章:

android - 从android中的ksoap2获取数据

java - 发送类型复杂的 Soap 错误 org.xmlpull.v1.XmlPullParserException : expected: START_TAG

android - 如何使用 KSOAP2 从 body 获取数据 - android

android - 未知选项 `allow-unrelated-histories'

seo - 网站爬虫从单个页面返回多个 404,其中在 url 的末尾附加了内部 href?有关上下文,请参阅正文

android - 检查设备是否锁定在纵向模式

gwt - 如何处理GWT的404错误?

java - Spring MVC Rest 客户端获取 HttpClientErrorException : 404 null

Android:如何检查应用程序是否已进入后台以避免不需要的 BroadcastReceiver 检查

java - 在 Java Android 应用程序中使用 Kotlin 代码