Вызов операции мыла из Android без параметров - PullRequest
1 голос
/ 24 июля 2011

У меня есть простая операция веб-службы, например:

@WebService(endpointInterface = "soap.service.sei.HelloWorldSei")
public class Sib {
   public String sayHello() {
      return "Hello World!";
   }
}

Я использую библиотеку ksoap2 для Android. В моей активности Android у меня есть:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    envelope.setOutputSoapObject(request);
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
    try {
            androidHttpTransport.call(SOAP_ACTION, envelope);
            SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
            lblResult.setText(resultsRequestSOAP.toString());
        } catch (Exception e) {
            System.out.println("******* THERE WAS AN ERROR ACCESSING THE WEB SERVICE");
            e.printStackTrace();
        }
}

У меня вопрос: поскольку операция sayHello не принимает параметров, нужно ли включать какие-либо экземпляры PropertyInfo?

1 Ответ

1 голос
/ 24 июля 2011

Да, похоже, что вы можете. Вот рабочий клиент мыла для Android:

    package soap.service.image;

    import org.ksoap2.SoapEnvelope;
    import org.ksoap2.serialization.SoapObject;
    import org.ksoap2.serialization.SoapPrimitive;
    import org.ksoap2.serialization.SoapSerializationEnvelope;
    import org.ksoap2.transport.HttpTransportSE;

    import android.app.Activity;
    import android.os.Bundle;

    public class ImageSoapActivity extends Activity {

        private static final String NAMESPACE = "http://image.webservice";
        private static final String URL = "http://10.0.2.2:8080/images?wsdl";
        private static final String METHOD_NAME = "getImage";
        private static final String SOAP_ACTION = "http://image.webservice/getImage";   

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
            envelope.setOutputSoapObject(request);
            HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
            try {
                androidHttpTransport.call(SOAP_ACTION, envelope);
                SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
                System.out.println("****** RESULT: " + resultsRequestSOAP.toString());
            } catch (Exception e) {
                System.out.println("******* THERE WAS AN ERROR ACCESSING THE WEB SERVICE");
                e.printStackTrace();
            }        
        }
}

Как видите, объекты PropertyInfo не требуются;) На стороне службы я использую Jax-ws. Надеюсь, это поможет кому-то еще. О, и это также стоит упомянуть, что если вы используете Jax-w для создания мыльного сервиса, я обнаружил, что получаю страшное исключение «не удается найти способ отправки» в Android, если я не использую следующие элементы в @ Аннотация WebService для моего интерфейса конечной точки службы и компонента реализации службы: Вот интерфейс конечной точки службы

package soap.service.sei;

import javax.jws.WebService;
// I get an error in android if I don't include these elements in the
// @WebService annotation
@WebService(name = "ImageSei", targetNamespace = "http://image.webservice")
public interface ImageSei {
    public byte[] getImage();
}

Вот мой бин реализации сервиса

package soap.service.impl;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.jws.WebService;

import soap.service.sei.ImageSei;
// I get an error in android if I don't include these elements in the
// @WebService annotation
@WebService(endpointInterface = "soap.service.sei.ImageSei", portName = "ImageWSPort",
        serviceName = "ImageWSService", targetNamespace = "http://image.webservice")
public class ImageSib implements ImageSei {

    @Override
    public byte[] getImage() {
        byte[] imageBytes = null;
        try {
            File imageFile = new File("C:\\images\\car.png");
            BufferedImage img = ImageIO.read(imageFile);
            ByteArrayOutputStream baos = new ByteArrayOutputStream(1000);
            ImageIO.write(img, "png", baos);
            baos.flush();
            imageBytes = baos.toByteArray();
            baos.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
        System.out.println("Got request");
        return imageBytes;
    }

}

Как видите, этот сервис читает изображение в виде серии байтов и отправляет его на устройство Android в виде массива байтов.

enter image description here

...