使用 Ksoap2 将日期发送到服务器
Send date to the server using Ksoap2
我正在尝试向服务器发送请求,其中一个参数的类型应该是 date
。如何设置打字日期?因为现在我的请求的类型是 string
。
我发送到服务器的请求:
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns:d="http://www.w3.org/2001/XMLSchema"
xmlns:c="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header /><v:Body><n0:getOutlets id="o0" c:root="1" xmlns:n0="http://www.kltro.com">
<userId i:type="d:string">a24f0c23-5f36-11e4-b332-984be174a0cc</userId>
<date i:type="d:string">2016-08-25</date>
</n0:getOutlets>
</v:Body>
</v:Envelope>
Activity 发送请求:
public class MainActivity extends AppCompatActivity {
private static final String NAMESPACE = "http://www.kltro.com";
private static final String METHODNAME = "getOutlets";
private static final String WSDL = "http://mapx.kashkan.org:5445/tro/ws/kltro";
private static final String SOAP_ACTION = NAMESPACE + "#kltro:" + METHODNAME;
private static String TAG = "soap";
public static String callWebservice() {
String responseDump = "";
String requestDump="";
try {
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
SoapObject request = new SoapObject(NAMESPACE, METHODNAME);
request.addProperty("userId", "a24f0c23-5f36-11e4-b332-984be174a0cc");
request.addProperty("date", "2016-08-25");
envelope.bodyOut = request;
HttpTransportSE transport = new HttpTransportSE(WSDL);
transport.debug = true;
try {
transport.call(SOAP_ACTION, envelope);
requestDump = transport.requestDump;
responseDump = transport.responseDump;
Log.e(TAG, requestDump +"requestDump");
Log.e(TAG, responseDump+"responseDump");
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, requestDump +"requestDump");
Log.e(TAG, responseDump+"responseDump");
}
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, requestDump+"responseDump");
Log.e(TAG, responseDump+"responseDump");
}
Log.e("requestDump", requestDump);
Log.e(TAG, responseDump+"responseDump");
return responseDump;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
callWebservice();
}
}
通过 ksoap2-android
库发送日期有点复杂。 ksoap2-android
库不知道序列化(或编组)日期类型。所以你需要给一个自定义 Marshal
class.
但幸运的是 ksoap2-android
图书馆已经有了 MarshalDate
class。查看其来源 here.
您需要做的就是将此 class 注册到您的 SoapSerializationEnvelope。
查看下面的代码,
private static final String NAMESPACE = "http://www.kltro.com";
private static final String METHODNAME = "getOutlets";
private static final String WSDL = "http://mapx.kashkan.org:5445/tro/ws/kltro";
private static final String SOAP_ACTION = NAMESPACE + "#kltro:" + METHODNAME;
private static String TAG = "soap_tester";
public static String callWebservice() {
String responseDump = "";
try {
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
// Register the Date Marshal class
new MarshalDate().register(envelope);
SoapObject request = new SoapObject(NAMESPACE, METHODNAME);
request.addProperty("userId", "a24f0c23-5f36-11e4-b332-984be174a0cc");
// Your date
String dateStr = "2016-08-25";
// Parse the date into an object of type java.util.Date
SimpleDateFormat sdfIn = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
// You might want to play around with the timezones
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("ru"), Locale.ENGLISH);
calendar.setTime(sdfIn.parse(dateStr));
// Clear the hour, minute and second
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date date = calendar.getTime();;
// Create a property with the date object and type as java.util.Date.class
PropertyInfo dateProperty = new PropertyInfo();
dateProperty.setValue(date);
dateProperty.setName("date");
dateProperty.setType(Date.class);
// Add it to the request
request.addProperty(dateProperty);
envelope.bodyOut = request;
HttpTransportSE transport = new HttpTransportSE(WSDL);
transport.debug = true;
try {
transport.call(SOAP_ACTION, envelope);
String requestDump = transport.requestDump;
responseDump = transport.responseDump;
Log.e(TAG, requestDump);
Log.e(TAG, responseDump);
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
return responseDump;
}
这是requestDump
,
<?xml version="1.0" encoding="UTF-8"?>
<v:Envelope xmlns:v="http://schemas.xmlsoap.org/soap/envelope/" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<v:Header />
<v:Body>
<n0:getOutlets xmlns:n0="http://www.kltro.com" id="o0" c:root="1">
<userId i:type="d:string">a24f0c23-5f36-11e4-b332-984be174a0cc</userId>
<date i:type="d:dateTime">2016-08-24T00:00:00.000Z</date>
</n0:getOutlets>
</v:Body>
</v:Envelope>
祝你好运:)
我正在尝试向服务器发送请求,其中一个参数的类型应该是 date
。如何设置打字日期?因为现在我的请求的类型是 string
。
我发送到服务器的请求:
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns:d="http://www.w3.org/2001/XMLSchema"
xmlns:c="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header /><v:Body><n0:getOutlets id="o0" c:root="1" xmlns:n0="http://www.kltro.com">
<userId i:type="d:string">a24f0c23-5f36-11e4-b332-984be174a0cc</userId>
<date i:type="d:string">2016-08-25</date>
</n0:getOutlets>
</v:Body>
</v:Envelope>
Activity 发送请求:
public class MainActivity extends AppCompatActivity {
private static final String NAMESPACE = "http://www.kltro.com";
private static final String METHODNAME = "getOutlets";
private static final String WSDL = "http://mapx.kashkan.org:5445/tro/ws/kltro";
private static final String SOAP_ACTION = NAMESPACE + "#kltro:" + METHODNAME;
private static String TAG = "soap";
public static String callWebservice() {
String responseDump = "";
String requestDump="";
try {
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
SoapObject request = new SoapObject(NAMESPACE, METHODNAME);
request.addProperty("userId", "a24f0c23-5f36-11e4-b332-984be174a0cc");
request.addProperty("date", "2016-08-25");
envelope.bodyOut = request;
HttpTransportSE transport = new HttpTransportSE(WSDL);
transport.debug = true;
try {
transport.call(SOAP_ACTION, envelope);
requestDump = transport.requestDump;
responseDump = transport.responseDump;
Log.e(TAG, requestDump +"requestDump");
Log.e(TAG, responseDump+"responseDump");
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, requestDump +"requestDump");
Log.e(TAG, responseDump+"responseDump");
}
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, requestDump+"responseDump");
Log.e(TAG, responseDump+"responseDump");
}
Log.e("requestDump", requestDump);
Log.e(TAG, responseDump+"responseDump");
return responseDump;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
callWebservice();
}
}
通过 ksoap2-android
库发送日期有点复杂。 ksoap2-android
库不知道序列化(或编组)日期类型。所以你需要给一个自定义 Marshal
class.
但幸运的是 ksoap2-android
图书馆已经有了 MarshalDate
class。查看其来源 here.
您需要做的就是将此 class 注册到您的 SoapSerializationEnvelope。
查看下面的代码,
private static final String NAMESPACE = "http://www.kltro.com";
private static final String METHODNAME = "getOutlets";
private static final String WSDL = "http://mapx.kashkan.org:5445/tro/ws/kltro";
private static final String SOAP_ACTION = NAMESPACE + "#kltro:" + METHODNAME;
private static String TAG = "soap_tester";
public static String callWebservice() {
String responseDump = "";
try {
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
// Register the Date Marshal class
new MarshalDate().register(envelope);
SoapObject request = new SoapObject(NAMESPACE, METHODNAME);
request.addProperty("userId", "a24f0c23-5f36-11e4-b332-984be174a0cc");
// Your date
String dateStr = "2016-08-25";
// Parse the date into an object of type java.util.Date
SimpleDateFormat sdfIn = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
// You might want to play around with the timezones
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("ru"), Locale.ENGLISH);
calendar.setTime(sdfIn.parse(dateStr));
// Clear the hour, minute and second
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date date = calendar.getTime();;
// Create a property with the date object and type as java.util.Date.class
PropertyInfo dateProperty = new PropertyInfo();
dateProperty.setValue(date);
dateProperty.setName("date");
dateProperty.setType(Date.class);
// Add it to the request
request.addProperty(dateProperty);
envelope.bodyOut = request;
HttpTransportSE transport = new HttpTransportSE(WSDL);
transport.debug = true;
try {
transport.call(SOAP_ACTION, envelope);
String requestDump = transport.requestDump;
responseDump = transport.responseDump;
Log.e(TAG, requestDump);
Log.e(TAG, responseDump);
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
return responseDump;
}
这是requestDump
,
<?xml version="1.0" encoding="UTF-8"?>
<v:Envelope xmlns:v="http://schemas.xmlsoap.org/soap/envelope/" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<v:Header />
<v:Body>
<n0:getOutlets xmlns:n0="http://www.kltro.com" id="o0" c:root="1">
<userId i:type="d:string">a24f0c23-5f36-11e4-b332-984be174a0cc</userId>
<date i:type="d:dateTime">2016-08-24T00:00:00.000Z</date>
</n0:getOutlets>
</v:Body>
</v:Envelope>
祝你好运:)