java - 如何从 Android Studio 项目调用 Web 服务

标签 java android-studio

我是 Android 和 Java 新手,请原谅我缺乏知识。我正在尝试获取对我在 .NET 中编写的 Web 服务的响应。

这是一项简单的服务。传递 userid 和 passwd,如果找到则返回用户姓氏,如果未找到则返回 NO。我有一个 VB 2017 程序,它按预期工作,但尝试在 Android 环境中也得到相同的结果。

这是我的导入:

import java.io.IOException;
import java.net.SocketException;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.SoapFault;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

单击按钮后,我有以下内容。

{
  String userID = "Tom";
  String pwd = "&yhe$43*";

  userid = new PropertyInfo();
  password = new PropertyInfo();

  SoapObject request = new SoapObject("http://tempuri.org/", "WebService1");

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

  userid.setName("userID");
  userid.setValue(userID);
  userid.setType(String.class);
  password.setName("password");
  password.setValue("Yo");
  password.setType(String.class);

  request.addProperty(userid);
  request.addProperty(password);
  try {
    httpTransport.call(SOAP_ACTION, envelope);
    SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
    String resp = response.toString();
    Toast.makeText(MainActivity.this, (CharSequence) resp, Toast.LENGTH_LONG).show();
  } catch (Exception e) {
    Toast.makeText(MainActivity.this, (CharSequence) e, Toast.LENGTH_LONG).show();
  }
}

此行发生错误:

httpTransport.call(SOAP_ACTION, envelope); 

看起来它正在获得

java.lang.reflect.InvocationTargetException

这里有明显的错误吗?

这是数据Logcat:

java.lang.IllegalStateException: Could not execute method for android:onClick
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:402)
    at android.view.View.performClick(View.java:6294)
    at android.view.View$PerformClick.run(View.java:24770)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397)
    at android.view.View.performClick(View.java:6294) 
    at android.view.View$PerformClick.run(View.java:24770) 
    at android.os.Handler.handleCallback(Handler.java:790) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6494) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.ClassCastException: android.os.NetworkOnMainThreadException cannot be cast to java.lang.CharSequence
    at com.example.myapplication.MainActivity.getName(MainActivity.java:71)
    at java.lang.reflect.Method.invoke(Native Method) 
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397) 
    at android.view.View.performClick(View.java:6294) 
    at android.view.View$PerformClick.run(View.java:24770) 
    at android.os.Handler.handleCallback(Handler.java:790) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6494) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

最佳答案

问题出在这一行,我认为:

       Toast.makeText(MainActivity.this, (CharSequence) e, Toast.LENGTH_LONG).show();

您将 e(类型为“Exception”)转换为 CharSequence,这显然是非法的,因为类不能同时继承 Exception 和 CharSequence。

尝试使用“e.getMessage()”而不是“(CharSequence) e”。这不会解决异常的实际原因,但至少您将能够看到实际的异常是什么。

关于java - 如何从 Android Studio 项目调用 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62050683/

相关文章:

java - 在 Android Studio 中显示在线数据库中的表和列

java - 地理围栏 : GoogleApiClient is not connected yet

java - 向 Java 列表添加/删除条目是否会重新分配内存?

java - JAXRS/RestEasy 中的@Produces 集合

每个元素有 2 个值的 Java 列表

android-studio - 如何更改快速文档的默认字体大小?

java - 将复选框值的数组列表插入 mysql 行

android-studio - 在 Android Studio 中打开 cocos2d-x-3.7

java - 使用 printf 处理多种格式

java - 如何通过方向更改来维护过滤的 CursorAdapter 的状态?