如何获得soapobject 用法里的属性名称

Web Service的使用 - 简书
下载简书移动应用
写了20881字,被10人关注,获得了18个喜欢
Web Service的使用
之前一直都是从服务器端接收json数据进行解析。一下子碰到关于Web Service的就懵了,网上找了很多资料,都不是太全。自己就结合着公司的项目和找到的资料来整理了一下有关的内容,以便日后复习、调用。
SOAP依赖于XML文档来构建,一条SOAP消息就是一份特定的XML文档,SOAP消息包含三个主要元素:
必须的&Envelope.../&根元素,SOAP消息对应的XML文档以该元素作为跟元素。
可选的&Header.../&元素,包含SOAP消息的头信息。
必须的&Body.../&元素,包含所有的调用和响应的头信息。
使用Android应用调用Web Service
如果要调用Web Service,需要添加一个的第三方库。
创建HttpTransportSE对象,该对象用于调用Web Service操作。
创建SoapSerializationEnvelope对象。
创建SoapObject对象,创建该对象时需要传入所要调用Web Service的命名控件、Web Service方法名。
如果有参数需要传给Web Service服务器端,调用SoapObject对象的addProperty(String name, Object value)方法来设置参数,该方法的name参数指定参数名;value参数指定参数值。
调用SoapSerializationEnvelope的setOutputSoapObject()方法或直接对bodyOut属性赋值,将前两步创建的SoapObject对象设为SoapSerializationEnvelope的传出SOAP消息体。
调用对象的call()方法,并以SoapSerializationEnvelope作为参数调用远程Web Service。
调用完成后,访问SoapSerializationEnvelope对象的bodyIn属性,该属性返回一个SoapObject对象,该对象就代表了Web Service的返回消息。解析该SoapObject对象,即可获取调用Web Service的返回值。
Constants.java
public class Constants{
//在常量中定义了命名空间和服务器地址
public static final String NAMESPACE = "";
public static final String URL = "";
SoapUtil.java
//SOAP解析的工具类
//分为两部分:带有头验证和不需要头验证的
public class SoapUtil{
public static String Soap(String method_name, String[] params, Object[] values){
//根据命名控件和方法名称创建SoapObject对象
SoapObject soapObject = new SoapObject(Constants.NAMESPACE, method_name);
if(params != null){
//添加所需上传的属性值
for(int i = 0; i & params. i++){
soapObject.addProperty(params[i], values[i]);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
//上传所需参数
envelope.bodyOut = soapO
envelope.dotNet =
HttpTransportSE ht = new HttpTransportSer(Constants.URL);
ht.call(Constants.NAMESPACE + method_name, envelope);
if(envelope.getResponse() != null){
//使用getResponse()方法直接返回数据
//若用bodyIn则返回的是&Body.../&中的内容
String result = envelope.getResponse().toString();
return result;
}catch(IOException e){
e.printStackTrace();
}catch(XmlPullParserException e){
e.printStackTrace();
public static String SoapWithHeader(String
method_name, String[] params, Object[] values,
String timeStamp){
Element[] header = new Element[1];
header[0] = new Element().createElement(Constants.NAMESPACE, "MySoapHeader");
Element pass = new Element().createElement(Constants.NAMESPACE, "TimeStamp");
pass.addChild(Node.TEXT, timeStamp);
header[0].addChild(Node.ELEMENT, pass);
SoapObject soapObject = new SoapObject(Constants.NAMESPACE, method_name);
if (params != null){
for (int i = 0; i & params. i++){
soapObject.addProperty(params[i],values
SoapSerializationEnvelope envelope = new
SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.headerOut =
envelope.bodyOut = soapO
envelope.dotNet =
envelope.setOutputSoapObject(soapObject);
HttpTransportSE ht = new HttpTransportSE(Constants.URL);
ht.call(Constants.NAMESPACE + method_name,envelope);
if (envelope.getResponse() != null){
String result = envelope.getResponse().toString();
Log.i("tag", "result:" + result);
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
在AndroidManifest.xml文件中添加网络权限
MainActivity.java
布局文件中就一个简单的TextView
public class MainActivity extends AppCompatActivity {
private TextV
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
new MyAsyncTask().execute();
class MyAsyncTask extends AsyncTask&Object, Object, Void& {
String timeStamp = "";
String[] key = {"username", "password"};
Object[] values = {"1", "1"};
protected void onPostExecute(Void aVoid) {
tv.setText(result);
protected Void doInBackground(Object... params) {
String method_name = "Login";
result = SoapUtil.SoapWithHeader(method_name, key, values, timeStamp);
JSONArray array = new JSONArray(result);
for (int i = 0; i & array.length(); i++){
JSONObject obj = array.getJSONObject(i);
Log.i("tag", "data" + obj);
} catch (JSONException e) {
e.printStackTrace();
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式: 您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&3.4.3 实战案例:SOAP解析天气服务
本文所属图书&>&
全书共11章,分为三个部分:概述篇(第1章)在介绍了Android开发平台后,重点讲解了Android网络程序的功能及开发环境的配置,引领读者走进Android网络编程的大门;实战篇(第2~8章),详细讲解了TCP、UDP、HTTP等...&&
以下为一个简单的实现天气查看功能的例子。在这个例子中,用户在文本框中输入城市名之后单击&查询&按钮,查询成功后,会在应用界面上显示所查询城市的天气信息。
其实现的具体过程为:从客户端获取用户输入的城市名称,将城市名称打包成符合SOAP协议的查询消息,把查询信息发送给提供SOAP天气服务的服务器;服务器内部进行操作之后,返回给客户端查询城市的天气信息,该信息以SOAP格式返回,客户端对其进行解析之后显示给用户。
下面是案例的布局文件,给出了使用的控件:
&RelativeLayout xmlns:android=&http:// /apk/res/android&
&&&&& xmlns:tools=&http:// /tools&
&&&&& android:layout_width=&match_parent&
&&&&& android:layout_height=&match_parent& &
&!--显示控件,用于显示天气情况 --&
&&& &TextView
&&&&& android:id=&@+id/textView1&
&&&&& android:layout_width=&wrap_content&
&&&&& android:layout_height=&wrap_content&
&&&&& android:layout_centerHorizontal=&true&
&&&&& android:layout_centerVertical=&true&
&&&&& android:padding=&@dimen/padding_medium&
&&&&& tools:context=&.SoapActivity& /&
&!--按钮,用户提交城市名称时候单击该按钮--&
&&& &Button
&&&&& android:id=&@+id/ok&
&&&&& android:layout_width=&wrap_content&
&&&&& android:layout_height=&wrap_content&
&&&&& android:layout_alignParentTop=&true&
&&&&& android:layout_toRightOf=&@+id/textView1&
&&&&& android:text=&@string/search& /&
&!--输入控件,用户输入城市名称--&
&&& &EditText
&&&&& android:id=&@+id/cityName&
&&&&& android:layout_width=&wrap_content&
&&&&& android:layout_height=&wrap_content&
&&&&& android:layout_alignParentLeft=&true&
&&&&& android:layout_alignParentTop=&true&
&&&&& android:text=&@string/cityName& /&
&/RelativeLayout&
应用内部对查询处理的主要代码如下:
import java.io.UnsupportedEncodingE
// 加入需要使用的ksoap2包中的类
import org.ksoap2.SoapE
import org.ksoap2.serialization.SoapO
import org.ksoap2.serialization.SoapSerializationE
import org.ksoap2.transport.HttpTransportSE;
import android.os.AsyncT
import android.os.B
import android.app.A
import android.view.M
import android.view.V
import android.widget.B
import android.widget.EditT
import android.widget.TextV
// SOAP方式查询天气情况
public class SoapActivity extends Activity {
&&&&& // 指定命名空间
&&&&& private static final String NAMESPACE = &http:// .cn/&;
&&&&& // 给出接口地址
&&&&& private static String URL =
&&&&&&&&&&&&&&& &http:// .cn/webservices/weatherwebservice.asmx&;
&&&&& // 设置方法名
&&&&& private static final String METHOD_NAME = &getWeatherbyCityName&;
&&&&& // 设置查询接口参数&
&&&&& private static String SOAP_ACTION =
&&&&&&&&&&&&&&& &http:// .cn/getWeatherbyC-ityName&;
&&&&& // 定义字符串,保存天气信息
&&&&& private String weatherT
&&&&& // 定义按钮
&&&&& private Button okB
&&&&& // 定义SoapObject对象
&&&&& private SoapO
&&&&& // 定义输入控件
&&&&& private EditText cityNameT
&&&&& // 定义显示控件,显示天气信息
&&&&& private TextView cityMsgV
&&&&& @Override
&&&&& public void onCreate(Bundle savedInstanceState) {
&&&&&&&&&&&&&&& super.onCreate(savedInstanceState);
&&&&&&&&&&&&&&& // 加载布局文件
&&&&&&&&&&&&&&& setContentView(R.layout.activity_android_soap);
&&&&&&&&&&&&&&& // 获取控件
&&&&&&&&&&&&&&& cityNameText& =(EditText)findViewById(R.id.cityName);
&&&&&&&&&&&&&&& cityMsgView = (TextView)findViewById(R.id.textView1);
&&&&&&&&&&&&&&& okButton = (Button) findViewById(R.id.ok);
&&&&&&&&&&&&&&& // 为按钮添加事件***
&&&&&&&&&&&&&&& okButton.setOnClickListener(new Button.OnClickListener() {
&&&&&&&&&&&&&&&&&&&&&&& public void onClick(View v) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // 执行获取天气信息的操作
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& new showWeatherAsyncTask().execute();
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& });
// 使用AsyncTask异步方式获取并显示天气信息
private class showWeatherAsyncTask extends AsyncTask&String, Integer, String& {
&&&&& @Override
&&&&& protected String doInBackground(String... Urls) {
&&&&&&&&&&&&&&& // 获取并显示天气信息
&&&&&&&&&&&&&&& showWeather();
&&&&&&&&&&&&&&&
&&&&& protected void onPostExecute(String result) {
// 获取并显示天气信息
private void showWeather() {
&&&&& // 获取需要查询的城市名称
&&&&& String city = cityNameText.getText().toString().trim();
&&&&& // 检测城市名称是否为空
&&&&& if(!city.isEmpty()){
&&&&&&&&&&&&&&& // 获取指定城市的天气信息
&&&&&&&&&&&&&&& getWeather(city);
// 获取指定城市的天气信息,参数cityName为指定的城市名称
public void getWeather(String cityName) {
&&&&& try {
&&&&&&&&&&&&&&& // 新建SoapObject对象
&&&&&&&&&&&&&&& SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME);
&&&&&&&&&&&&&&& // 给SoapObject对象添加属性
&&&&&&&&&&&&&&& rpc.addProperty(&theCityName&, cityName);
&&&&&&&&&&&&&&& // 创建HttpTransportSE对象,并指定WebService的WSDL文档的URL
&&&&&&&&&&&&&&& HttpTransportSE& ht = new HttpTransportSE(URL);
&&&&&&&&&&&&&&& // 设置debug模式
&&&&&&&&&&&&&&& ht.debug =
&&&&&&&&&&&&&&& // 获得序列化的envelope
&&&&&&&&&&&&&&& SoapSerializationEnvelope envelope =
&&&&&&&&&&&&&&&&&&&&&&& new SoapSerializationEnvelope(SoapEnvelope.VER11);
&&&&&&&&&&&&&&& // 设置bodyOut属性的值为SoapObject对象rpc
&&&&&&&&&&&&&&& envelope.bodyOut =
&&&&&&&&&&&&&&& // 指定webservice的类型为dotNet
&&&&&&&&&&&&&&& envelope.dotNet =
&&&&&&&&&&&&&&& envelope.setOutputSoapObject(rpc);
&&&&&&&&&&&&&&& // 使用call方法调用WebService方法
&&&&&&&&&&&&&&& ht.call(SOAP_ACTION, envelope);
&&&&&&&&&&&&&&& // 获取返回结果
&&&&&&&&&&&&&&& SoapObject result = (SoapObject) envelope.bodyIn;
&&&&&&&&&&&&&&& // 使用getResponse方法获得WebService方法的返回结果
&&&&&&&&&&&&&&& detail = (SoapObject)result.getProperty(&getWeatherbyCityNameResult&);
&&&&&&&&&&&&&&& System.out.println(&detail& + detail);
&&&&&&&&&&&&&&& // 解析返回的数据信息为SoapObject对象,对其进行解析
&&&&&&&&&&&&&&& parseWeather(detail);
&&&&&&&&&&&&&&&
&&&&& } catch (Exception e) {
&&&&&&&&&&&&&&& e.printStackTrace();
// 解析SoapObject对象
private void parseWeather(SoapObject detail)throws UnsupportedEncodingException {
&&&&& // 获取日期
&&&&& String date = detail.getProperty(6).toString();
&&&&& // 获取天气信息
&&&&& weatherToday = &今天:& + date.split(& &)[0];
&&&&& weatherToday = weatherToday + & 天气:& + date.split(& &)[1];
&&&&& weatherToday = weatherToday + & 气温:& + detail.getProperty(5).toString() ;
&&&&&& weatherToday = weatherToday + & 风力:& + detail.getProperty(7).toString()+ & &;
&&&&& System.out.println(&weatherToday is & + weatherToday);
&&&&& // 显示到cityMsgView控件上
&&&&& cityMsgView.setText(weatherToday);
// 创建Menu菜单
public boolean onCreateOptionsMenu(Menu menu) {
&&&&& getMenuInflater().inflate(R.menu.activity_android_soap, menu);
运行效果如图3-9所示。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'英语翻译soap:2304:Object status prohibits operation:
AOI圣诞三0031
soap(应该是汇编语言里面的一种优先程序吧)-2304(soap代码)目标状态-阻止运行.
为您推荐:
其他类似问题
香皂: 2304 :禁止试用
扫描下载二维码

参考资料

 

随机推荐