android - HttpTransportSE requestDump 给出 NullPointerException

标签 android ksoap2 ksoap httptransportse

我正在尝试通过适用于 Android 的 Ksoap2 访问 Android 中的 webservice

SoapObject 创建成功,bodyOut 的 S.O.P 输出所需的字符串。但是,当我对我创建的 HttpTransportSE 对象执行 requestDump 以进行调用时,会发生 NullPointerException。换句话说,传输对象为空。怎么会这样?

Web 服务位于 http://srilanka.lk:9080/services/CropServiceProxy?wsdl

此服务与 SoapUI 配合得很好。

SoapUI 请求:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:v1="http://schemas.icta.lk/xsd/crop/handler/v1/">
   <soap:Header/>
   <soap:Body>
      <v1:getCropDataList>
         <v1:code>ABK</v1:code>
      </v1:getCropDataList>
   </soap:Body>
</soap:Envelope>

SoapUI 响应:

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
   <soapenv:Body>
      <ns1:getCropDataListResponse xmlns:ns1="http://schemas.icta.lk/xsd/crop/handler/v1/">
         <ns1:cropInfo>
            <ns1:name>Ambul Kesel</ns1:name>
            <ns1:price>35.0</ns1:price>
            <ns1:location>Dambulla</ns1:location>
         </ns1:cropInfo>
         <ns1:cropInfo>
            <ns1:name>Ambul Kesel</ns1:name>
            <ns1:price>40.0</ns1:price>
            <ns1:location>Dambulla</ns1:location>
         </ns1:cropInfo>
      </ns1:getCropDataListResponse>
   </soapenv:Body>
</soapenv:Envelope>

客户端复杂类型KvmSerializable实现:

public class CropInfo implements KvmSerializable {

 private String name;
 private float price;
 private String location;

 @Override
 public Object getProperty(int arg0) {
  switch (arg0){
  case 0:
   return name;
  case 1:
   return price;
  case 2:
   return location;
  default:
    return null;
  }
 }

 @Override
 public int getPropertyCount() {
  return 3;
 }

 @Override
 public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
  switch (arg0){
  case 0:
   arg2.type = PropertyInfo.STRING_CLASS;
   arg2.name = "Name";
   break;
  case 1:
   arg2.type = Float.class;
   arg2.name = "Price";
   break;
  case 2:
   arg2.type = PropertyInfo.STRING_CLASS;
   arg2.name = "Location";
   break;
  default:
    break;
  }

 }

 @Override
 public void setProperty(int arg0, Object arg1) {
  switch(arg0){
  case 0:
   name = arg1.toString();
   break;
  case 1:
   price = Float.parseFloat(arg1.toString());
  case 2:
   location = arg1.toString();
  default:
   break;
  }
 }
}

网络服务调用:

public void btnOnClick(View v){
     String NAMESPACE = "http://schemas.icta.lk/xsd/crop/handler/v1/";
  String URL = "http://220.247.225.202:9080/services/CropServiceProxy.CropServiceProxyHttpSoap12Endpoint";

  String method_name = "getCropDataList";
  String SOAP_ACTION = "http://schemas.icta.lk/xsd/crop/handler/v1/getCropDataList";

  SoapObject soap_request = new SoapObject(NAMESPACE, method_name);
  soap_request.addProperty("code", "ABK" );

  SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
  envelope.setOutputSoapObject(soap_request);
  envelope.addMapping(NAMESPACE, "cropInfo", CropInfo.class);
  //envelope.dotNet=true;

  Marshal floatMarshal = new MarshalFloat();
  floatMarshal.register(envelope);

  System.out.println("body out : " + envelope.bodyOut.toString());

  //AndroidHttpTransport http_transport = new AndroidHttpTransport(URL);
  HttpTransportSE http_transport  = new HttpTransportSE(URL);
  try {
                    //NullPointerException HERE
   System.out.println(http_transport.requestDump);
   http_transport.call(SOAP_ACTION, envelope);

   //because we should expect a vector, two kinds of prices are given
   Vector<CropInfo> result_array = (Vector<CropInfo>)envelope.getResponse();
   if(result_array != null){
    for (CropInfo current_crop: result_array){
     System.out.println(current_crop.getName());
     System.out.println(Float.toString(current_crop.getPrice()));
    }
   }

  } catch (Exception e) {
   e.printStackTrace();
   answer.setText("error caught");
   //System.out.println(http_transport.responseDump);
  }

  // String result_string[] = (String[])result;

  //answer.setText("returned");

    }

谁能解释一下?

最佳答案

您需要设置 debug Transport 实例的字段设置为 true,然后调用 call(String,SoapEnvelope) 方法以获取 requestDump 要设置的字段:

  HttpTransportSE http_transport = new HttpTransportSE(URL);
  http_transport.debug = true;
  try {
   http_transport.call(SOAP_ACTION, envelope);
   System.out.println(http_transport.requestDump);
  //...

关于android - HttpTransportSE requestDump 给出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4574690/

相关文章:

android - TabHost 和 FragmentTabHost 的区别

android - 将自定义对象的 ArrayList 传递给 kSOAP 函数

java - 使用 KSOAP2 序列化要发送的整数数组

android - 服务器无法处理请求。连接未关闭

android xmlpullparser异常

java - Android kSOAP Web服务问题

android - LogCat android unity3d游戏崩溃

java - 无法从静态上下文引用 FindViewById

android - 从 Android Studio 中的 Gitlab 克隆存储库时出现 "Repositroy test has failed"错误?