Java 在android中使用webservice响应对象
我有以下Web服务: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
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;
}