java - (JAVA) SOAP WebService 错误对象引用未设置到对象的实例

标签 java android web-services soap

我正在尝试从 Android 应用程序设置与 SOAP WebService 的连接,但每次我的结果中都会出现写入错误: 未将对象引用设置为对象 java 的实例 似乎是来自服务器的错误 --> SOAP Webservice call from Java gives "Object reference not set to an instance of an object"

但是当我通过网络浏览器使用 POST 请求尝试它时,它工作正常:)

此服务http://ws.cdyne.com/ip2geo/ip2geo.asmx?op=ResolveIP

private static String NAMESPACE = "http://ws.cdyne.com/";
private static String URL = "http://ws.cdyne.com/ip2geo/ip2geo.asmx";
private static String SOAP_ACTION = "http://ws.cdyne.com/";

public static String invokeHelloWorldWS(String name, String webMethName) {
    String resTxt = null;

    SoapObject request = new SoapObject(NAMESPACE, webMethName);
    PropertyInfo sayHelloPI = new PropertyInfo();
    // Set name
    sayHelloPI.setName("ipAddress");
    // Set Value
    sayHelloPI.setValue("88.212.35.129");
    // Set dataType
    sayHelloPI.setType(String.class);
    // Add the property to request object
    request.addProperty(sayHelloPI);
    // Create envelope
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;  
    // Set output SOAP object
    envelope.setOutputSoapObject(request);
    // Create HTTP call object
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
    androidHttpTransport.debug = true;
    try{
        // Invoke web service
        androidHttpTransport.call(SOAP_ACTION+webMethName, envelope);  //webMethName = "ResolveIP"
        // Get the response
        Log.d("a", androidHttpTransport.responseDump);
        //SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
        // Assign it to resTxt variable static variable
        //resTxt = response.toString();
    }catch(Exception e){
         //Print error
        e.printStackTrace();
    }
}

我在谷歌上花了很多时间,但我无法找到正确的答案为什么会发生这种情况

//编辑 最后我得到了正确的...不知道为什么但是当我像这样发送第二个参数时(我重用旧属性):

sayHelloPI.setName("licenseKey");
sayHelloPI.setValue("some_key");
sayHelloPI.setType(String.class);
request.addProperty(sayHelloPI);

它不起作用。但是当我创建新的 Property 对象时它会起作用:

PropertyInfo sayHelloPI1 = new PropertyInfo();
sayHelloPI1.setName("licenseKey");
sayHelloPI1.setValue("ds");
sayHelloPI1.setType(String.class);
request.addProperty(sayHelloPI1);

也许下次会对某人有所帮助

最佳答案

这是我自己使用过的一些代码 - 希望它会对您有所帮助:

        // Initialize soap request + add parameters
        SoapObject request = new SoapObject(getString(R.string.Namespace),
                getString(R.string.Method_Name_GetStudentsByTeam));
        Log.d("GetStudentsByTeamTask", "SOAP request");

        // Use this to add parameters
        request.addProperty("teamId", params[0]);
        Log.d("GetStudentsByTeamTask", "id: " + params[0]);

        // Declare the version of the SOAP request
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        Log.d("GetStudentsByTeamTask",
                "Declared the version of the SOAP request");

        envelope.setOutputSoapObject(request);
        envelope.dotNet = true;
        Log.d("GetStudentsByTeamTask", "Setting som variables");
        try {
            HttpTransportSE androidHttpTransport = new HttpTransportSE(
                    getString(R.string.URL));
            Log.d("GetStudentsByTeamTask", "Instance the HttpTransportSE");

            // this is the actual part that will call the webservice
            androidHttpTransport.call(
                    getString(R.string.Soap_Action_GetStudentsByTeam),
                    envelope);
            Log.d("GetStudentsByTeamTask", "Called the Webservice");

            // Get the SoapResult from the envelope body.
            SoapObject result = (SoapObject) envelope.getResponse();
            Log.d("GetStudentsByTeamTask", "Got the Soapresult");

            if (result != null) {
                // Do something with result
                // success = true;
                Log.d("GetStudentsByTeamTask", "set sucess boolean to true");

                for (int i = 0; i < result.getPropertyCount(); i++) {

                    PropertyInfo pi = new PropertyInfo();
                    result.getPropertyInfo(i, pi);
                    Log.d("GetStudentsByTeamTask",
                            pi.name + " : " + result.getProperty(i));

                    SoapObject obj = (SoapObject) result.getProperty(i);

                    Student student = new Student();

                    student.address = obj.getProperty("Address").toString();

                    student.city = obj.getProperty("City").toString();
                    student.created = DateTime.parse(obj.getProperty(
                            "Created").toString());
                    student.dateOfBirth = DateTime.parse(obj.getProperty(
                            "DateOfBirth").toString());
                    student.email = obj.getProperty("Email").toString();
                    student.firstname = obj.getProperty("FirstName")
                            .toString();
                    student.id = Integer.parseInt(obj.getProperty("ID")
                            .toString());
                    student.imageId = Integer.parseInt(obj.getProperty(
                            "ImageID").toString());
                    // SoapObject lastNameObject = (SoapObject) obj
                    // .getProperty("LastName");
                    //
                    student.lastName = obj.getProperty("LastName")
                            .toString();

                    student.phone = obj.getProperty("Mobile").toString();

                    student.zipcode = obj.getProperty("PostalCode")
                            .toString();
                    student.schoolId = Integer.parseInt(obj
                            .getPropertyAsString("SchoolId"));
                    student.teamId = Integer.parseInt(obj
                            .getPropertyAsString("TeamId"));
                    student.testStarted = Integer.parseInt(obj
                            .getPropertyAsString("TestsStarted"));
                    student.timeStamp = DateTime.parse(obj
                            .getPropertyAsString("TimeStamp"));
                    student.image = getImage(Integer.parseInt(obj
                            .getProperty("ImageID").toString()));

                    if (student.image == null)
                        student.image = BitmapFactory
                                .decodeResource(getResources(),
                                        R.drawable.default_usericon);

                    MyApp.getController().addStudent(student);
                }

            } else {
                // If fails
                // success = false;
                Log.d("GetStudentsByTeamTask", "set login boolean to false");
            }
        } catch (Exception e) {
            Log.d("GetStudentsByTeamTask", "FAILED! " + e.getMessage());
            e.printStackTrace();
        }

关于java - (JAVA) SOAP WebService 错误对象引用未设置到对象的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26245935/

相关文章:

php - ReSTLer 总是返回未找到

java - 在云上部署 Web 服务

java - Spring Boot 配置处理器,前缀的重复@ConfigurationProperties 定义

java - 在具有两个计时器的类中,它们是否在两个单独的线程中执行?

java - 格式化没有货币符号的货币

javascript - 将 Apache Thrift 与 Apache Cordova 相结合

android, AudioRecord.read() --> 缓冲区溢出,如何处理缓冲区?

用于捕获图像和视频的 Android Intent ?

java - JAX-RS 2 : using Guava ListenableFuture for async resources

java - 同一类中的两个构造函数具有不同的参数