Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android中使用webservice响应对象_Java_C#_Android_Sql_Web Services - Fatal编程技术网

Java 在android中使用webservice响应对象

Java 在android中使用webservice响应对象,java,c#,android,sql,web-services,Java,C#,Android,Sql,Web Services,我有以下Web服务: public class Student { public int id; public string name; public string grade; } [WebMethod] public Student StudentDetails(string sName) { Student objStd = new Student(); SqlConnection conn; conn = Class1.Conne

我有以下Web服务:

public class Student
{
    public int id;
    public string name;
    public string grade;
}

[WebMethod]
public Student StudentDetails(string sName)
{
    Student objStd = new Student();  

    SqlConnection conn;

    conn = Class1.ConnectionManager.GetConnection();

    conn.Open();

    SqlCommand newCmd = conn.CreateCommand();
    newCmd.CommandType = CommandType.Text;
    newCmd.CommandText = "select * from dbo.tblUser where name='" + sName + "'";
    SqlDataReader sdr = newCmd.ExecuteReader();

    if (sdr.Read())
    {
        objStd.id = Int32.Parse(sdr["Id"].ToString());
        objStd.name = sdr["name"].ToString();
        objStd.grade = sdr["grade"].ToString();
    }

    conn.Close();
    sdr.Close();
    return objStd;
}
返回以下xml:

<?xml version="1.0" encoding="UTF-8"?>
<Student xmlns="http://tempuri.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <id>4</id>
    <name>lama</name>
    <grade>7</grade>

</Student>
但是我如何单独使用每个值并在不同的文本视图中显示它们呢

错误:

  import android.util.Log;

 import org.ksoap2.SoapEnvelope;
 import org.ksoap2.serialization.SoapSerializationEnvelope;
 import org.ksoap2.transport.Transport;


public class SoapAPIService {
private static final String XML_TAG_VERSION = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";

public static GetStudentDetailsResult getStudentDetails(StudentRequest params) {
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = IsDotNet;
    envelope.setOutputSoapObject(params.getSoapParams());

    new GetStudentDetailsResult().register(envelope);

    Transport transport = getTransport();
    transport.setXmlVersionTag(XML_TAG_VERSION);
    try {
        transport.call(params.getSoapAction(), envelope);
        GetStudentDetailsResult result = (GetStudentDetailsResult) envelope.bodyIn;
        return result;
    }  catch (Exception e) {
        Log.e(TAG, "Exception", e);
    }
    return null;
}
public GetStudentDetailsResult getStudentDetails(String id) {
    StudentRequest request = new StudentRequest(id);
    GetStudentDetailsResult result = SoapAPIService.getStudentDetails(request);
    return result;
}
}
导入android.util.Log;
导入org.ksoap2.SoapEnvelope;
导入org.ksoap2.serialization.SoapSerializationEnvelope;
导入org.ksoap2.transport.transport;
公共类服务{
私有静态最终字符串XML_TAG_VERSION=“”;
公共静态getStudentDetails结果getStudentDetails(StudentRequest参数){
SoapSerializationEnvelope=新的SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=IsDotNet;
setOutputSoapObject(params.getSoapParams());
新GetStudentDetailsResult().寄存器(信封);
传输=getTransport();
transport.setXmlVersionTag(XML_标记_版本);
试一试{
调用(params.getSoapAction(),信封);
GetStudentDetailsResult结果=(GetStudentDetailsResult)envelope.bodyIn;
返回结果;
}捕获(例外e){
Log.e(标签“例外”,e);
}
返回null;
}
公共getStudentDetails结果getStudentDetails(字符串id){
StudentRequest=newstudentrequest(id);
GetStudentDetailsResult结果=SoapAPIService.getStudentDetails(请求);
返回结果;
}
}
我犯了以下错误:

isDotNet。。无法解析符号

getTransport。。无法解析方法


标记无法解析符号。

虽然您没有提到,但我相信您必须使用KSoap2库进行SOAP web服务调用。考虑到这一点,您需要创建几个存根,如下所示:

1) 创建一个
BaseObject

import java.io.Serializable;

import org.ksoap2.serialization.KvmSerializable;

public abstract class BaseObject implements KvmSerializable, Serializable {

    private static final long serialVersionUID = 1L;

    public static final String NAMESPACE = "YOUR_WEB_SERVICE_NAMESPACE";

    public BaseObject() {
        super();
    }   
}
2) 与请求结构一致的请求对象。据我所知,您的请求只需要
Id

public class StudentRequest {

    public static final String NAMESPACE = "YOUR_WEB_SERVICE_NAMESPACE";
    private static final String METHOD_NAME = "API_METHOD_NAME";

    private String id;

    // constructor
    public StudentRequest(String id) {
        this.id = id;
    }

    public SoapObject getSoapParams() {
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        request.addProperty("Id", id);

        return request;
    }

    public String getSoapAction() {
        return NAMESPACE + METHOD_NAME;
    }
}
3) 响应对象

import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapSerializationEnvelope;

import com.tc2services.stubs.BaseObject;

public class GetStudentDetailsResult extends BaseObject {
    public String id;
    public String name;
    private String grade;

    @Override
    public Object getProperty(int index) {
        switch (index) {
        case 0:
            return id;
        case 1:
            return name;
        case 2:
            return grade;
        }
        return null;
    }

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

    @Override
    public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) {
        switch (index) {
        case 0:
            info.name = "id";
            info.type = String.class;
            break;
        case 1:
            info.name = "name";
            info.type = String.class;
            break;
        case 2:
            info.name = "grade";
            info.type = String.class;
            break;
        }

    }

    @Override
    public void setProperty(int index, Object obj) {
        switch (index) {
        case 0:
            id = (String) obj;
            break;
        case 1:
            name = (String) obj;
            break;
        case 2:
            grade = (String) obj;
            break;
        }

    }

    public void register(SoapSerializationEnvelope envelope) {
        envelope.addMapping(NAMESPACE, "YOUR_RESPONSE_METHOD_NAME", this.getClass());
    }
}
4) 要调用,可以使用单独的服务类,例如,
soapiservice
公开API,如下所示:

import org.ksoap2.transport.HttpTransportSE;
import org.ksoap2.transport.Transport;

public boolean IsDotNet = true;

public Transport getTransport() {
    return new HttpTransportSE(WEB_SERVICE_URL);
}

private static final String XML_TAG_VERSION = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";

public static GetStudentDetailsResult getStudentDetails(StudentRequest params) {
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = IsDotNet;
    envelope.setOutputSoapObject(params.getSoapParams());

    new GetStudentDetailsResult().register(envelope);

    Transport transport = getTransport();
    transport.setXmlVersionTag(XML_TAG_VERSION);
    try {
        transport.call(params.getSoapAction(), envelope);
        GetStudentDetailsResult result = (GetStudentDetailsResult) envelope.bodyIn;
        return result;
    }  catch (Exception e) {
        Log.e(TAG, "Exception", e);
    }
    return null;
}
请注意,您可能需要对方法名、URL、属性等进行一些调整,但下面是您希望采用存根方法使用ksoap2进行web服务调用时的基本框架


希望有帮助

StudentRequest、GetStudentDetailsResult都是我创建的新类?第4步和第5步它应该在mainactivity类中,或者在何处?是的,为了更好地实现代码模块化,可以将它们放在单独的类中。对于4和5,正如我提到的,您可以创建一个新类,比如说
soapiservice
,以及这里的所有web服务api方法,包括GetStudentDetails。如果您查看我文章的最后一部分,我对其进行了更新,那么soapiservice类中出现了错误。
import org.ksoap2.transport.HttpTransportSE;
import org.ksoap2.transport.Transport;

public boolean IsDotNet = true;

public Transport getTransport() {
    return new HttpTransportSE(WEB_SERVICE_URL);
}

private static final String XML_TAG_VERSION = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";

public static GetStudentDetailsResult getStudentDetails(StudentRequest params) {
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = IsDotNet;
    envelope.setOutputSoapObject(params.getSoapParams());

    new GetStudentDetailsResult().register(envelope);

    Transport transport = getTransport();
    transport.setXmlVersionTag(XML_TAG_VERSION);
    try {
        transport.call(params.getSoapAction(), envelope);
        GetStudentDetailsResult result = (GetStudentDetailsResult) envelope.bodyIn;
        return result;
    }  catch (Exception e) {
        Log.e(TAG, "Exception", e);
    }
    return null;
}
public GetStudentDetailsResult getStudentDetails(String id) {
    StudentRequest request = new StudentRequest(id);
    GetStudentDetailsResult result = SoapAPIService.getStudentDetails(request);
    return result;
}