2

www,tempuri.org が提供する Web サービスを呼び出すコードがあります。アプリケーションを実行しようとしているときに、アプリケーションが予期せず停止し、「残念ながら、MyTest が停止しました」というメッセージが表示されます。これが私の Java ファイルです -

MainActivity.java :-

package com.example.mytest;


import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;

import org.ksoap2.transport.HttpTransportSE;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {
    public static final String SOAP_ACTION = "http://tempuri.org/CelciusToFarenheit";
    public static final String METHOD_NAME = "CelciusToFarenheit";
    public static final String NAMESPACE= "http://tempuri.org/";
    public static final String URL = "http://www.w3schools.com/webservices/tempconvert.asmx";
    TextView tv;
    SoapEnvelope se;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv= (TextView) findViewById(R.id.TextView01);

        SoapObject Request=new SoapObject(NAMESPACE,METHOD_NAME);
        Request.addProperty("Celcius","32");
        SoapSerializationEnvelope sse = new SoapSerializationEnvelope (se.VER11);
        sse.dotNet=true;
        sse.setOutputSoapObject(Request);
        HttpTransportSE abt = new HttpTransportSE(URL);
        try
        {
            abt.call(SOAP_ACTION,se);
              SoapObject resultString=(SoapObject)sse.getResponse();   
              String resultData=resultString.getProperty(0).toString();

            tv.setText("Status :"+resultString);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }





    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

activity_main.xml :-

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/TextView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

logcat は次のとおりです。

08-10 01:35:10.421: E/AndroidRuntime(1077): FATAL EXCEPTION: main
08-10 01:35:10.421: E/AndroidRuntime(1077): java.lang.NoClassDefFoundError: org.ksoap2.serialization.SoapObject
08-10 01:35:10.421: E/AndroidRuntime(1077):     at com.example.mytest.MainActivity.onCreate(MainActivity.java:30)
08-10 01:35:10.421: E/AndroidRuntime(1077):     at android.app.Activity.performCreate(Activity.java:5133)
08-10 01:35:10.421: E/AndroidRuntime(1077):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
08-10 01:35:10.421: E/AndroidRuntime(1077):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
08-10 01:35:10.421: E/AndroidRuntime(1077):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
08-10 01:35:10.421: E/AndroidRuntime(1077):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
08-10 01:35:10.421: E/AndroidRuntime(1077):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
08-10 01:35:10.421: E/AndroidRuntime(1077):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-10 01:35:10.421: E/AndroidRuntime(1077):     at android.os.Looper.loop(Looper.java:137)
08-10 01:35:10.421: E/AndroidRuntime(1077):     at android.app.ActivityThread.main(ActivityThread.java:5103)
08-10 01:35:10.421: E/AndroidRuntime(1077):     at java.lang.reflect.Method.invokeNative(Native Method)
08-10 01:35:10.421: E/AndroidRuntime(1077):     at java.lang.reflect.Method.invoke(Method.java:525)
08-10 01:35:10.421: E/AndroidRuntime(1077):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
08-10 01:35:10.421: E/AndroidRuntime(1077):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-10 01:35:10.421: E/AndroidRuntime(1077):     at dalvik.system.NativeStart.main(Native Method)

AndroidでWebサービスを開発するのは初めてです。これをどうするか教えてください。

4

4 に答える 4

1

上記のNirmalの答えは私にとってはうまくいきました。ただし、アクションと名前空間を次のように更新する必要がありました。

private static final String SOAP_ACTION = "http://www.w3schools.com/webservices/CelsiusToFahrenheit";
private static final String NAMESPACE = "http://www.w3schools.com/webservices/";

私は正しい値がどうあるべきかを次のように考え出しました:

  1. Web サービス ページに移動: http://www.w3schools.com/webservices/tempconvert.asmx

  2. サービスの説明リンクをクリックします: http://www.w3schools.com/webservices/tempconvert.asmx?WSDL

  3. そのxmlで文字列(大文字と小文字を区別しない)「action」と「namespace」を検索し、それらの値を使用します

于 2014-04-10T19:21:19.817 に答える
1

次のように使用します。

XML:

      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
       android:layout_height="match_parent" >

<Button
    android:id="@+id/web_service"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="112dp"
    android:layout_marginTop="146dp"
    android:text="Web Service" />

<TextView
    android:id="@+id/fetch"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:text="TextView" />

  </RelativeLayout>

アクティビティ:

  public class MainActivity extends Activity {

Button web_service;
TextView fetch_service;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    fetch_service = (TextView) findViewById(R.id.fetch);
    web_service = (Button) findViewById(R.id.web_service);
    web_service.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            myasynctask MAT = new myasynctask();
            MAT.execute();
        }
    });
}

class myasynctask extends AsyncTask<String, Void, String> {

    String str;
    private static final String SOAP_ACTION = "http://tempuri.org/CelsiusToFahrenheit";
    private static final String METHOD_NAME = "CelsiusToFahrenheit";
    private static final String NAMESPACE = "http://tempuri.org/";
    private static final String URL = "http://www.w3schools.com/webservices/tempconvert.asmx";

    @Override
    protected String doInBackground(String... params) {
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        request.addProperty("Celsius", "32");

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

        HttpTransportSE ht = new HttpTransportSE(URL);

        try {
            ht.call(SOAP_ACTION, envelope);
            final SoapPrimitive response = (SoapPrimitive) envelope
                    .getResponse();
            str = response.toString();

        } catch (Exception e) {
            e.printStackTrace();

        }
        Log.d("WebRespone", str);
        return str;
    }

    @Override
    public void onPostExecute(String result) {
        // TODO Auto-generated method stub
        Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
        fetch_service.setText(result);
        super.onPostExecute(result);
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
    }

}
    }

マニフェスト: マニフェスト に次のシンを追加します

 <uses-permission android:name="android.permission.INTERNET"/>

出力: ここに画像の説明を入力

これがあなたを助けることを願っています。

于 2013-08-10T05:45:58.600 に答える
1

メイン UI スレッドでネットワーク関連の操作を行うことはできません。Threadまたはを使用する必要がありますAsyncTask

UIスレッドでネットワーク関連の操作を行っています。NetworkOnMainThredExceptionAPIレベル11以上になります。

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

AsyncTask ドキュメント:

http://developer.android.com/reference/android/os/AsyncTask.html

libs フォルダーの下に jar ファイルがないと思われます。libs フォルダーに ksoap jar ファイルが追加されていることを確認してください。

http://code.google.com/p/ksoap2-android/downloads/detail?name=ksoap2-android-assembly-2.4-jar-with-dependencies.jar&でダウンロードします。

スレッドを使用することもできますが、バックグラウンド スレッドから UI を更新することはできません。ui スレッドで ui を更新する必要があります。したがって、 asynctask を使用すると簡単になります。

例: 華氏HeitToCelsius. 同様に、CelciusToFarenheit に対して適切な SOAP メソッドを呼び出すことができます。従うべき同じ手順

 public class FirstScreen extends Activity
 {
 private static String SOAP_ACTION1 = "http://tempuri.org/FahrenheitToCelsius";
 private static String NAMESPACE = "http://tempuri.org/";
 private static String METHOD_NAME1 = "FahrenheitToCelsius";
 private static String URL = "http://www.w3schools.com/webservices/tempconvert.asmx?WSDL";
SoapObject result;
 Button b;
 EditText et;
 int value;
 TextView tv;
 ProgressDialog pd;

 @Override
  public void onCreate(Bundle savedInstanceState)
  {

    super.onCreate(savedInstanceState);
    pd= new ProgressDialog(this);
    pd.setTitle("Making Soap Request");
    setContentView(R.layout.activity_main); 
    b= (Button) findViewById(R.id.button1);
    tv= (TextView) findViewById(R.id.textView2);
    et= (EditText) findViewById(R.id.ed);
    b.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            value=Integer.parseInt(et.getText().toString());
            new one1().execute();
        }

    });


}

 private class one1 extends AsyncTask<String, Integer, SoapObject> {

  protected void onPreExecute()
  {
      pd.show();
  }
protected SoapObject doInBackground(String... arg0) {
    // TODO Auto-generated method stub
       //Initialize soap request + add parameters
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME1);    

    //Use this to add parameters
    request.addProperty("Fahrenheit",value);         

    //Declare the version of the SOAP request
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);          

    envelope.setOutputSoapObject(request);
    envelope.dotNet = true;         

    try {
          HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);                
          androidHttpTransport.call(SOAP_ACTION1, envelope);
          result = (SoapObject)envelope.bodyIn;

    } catch (Exception e) {

          e.printStackTrace();

    }           
    return result;
}

 protected void onPostExecute(SoapObject result)
 {
  pd.dismiss();
if(result != null)
{
      tv.setText("Result = "+result.getProperty(0).toString());
}
else
{
      Toast.makeText(getApplicationContext(), "No Response",Toast.LENGTH_LONG).show();
}
}

}

私の activity_main.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="FahrenheitToCelsius" />

<EditText
    android:id="@+id/ed"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="43dp" />

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginTop="37dp"
    android:text="MakeRequest" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginTop="20dp"
    android:text="Result" />

 </LinearLayout>

最後に、マニフェスト ファイルにインターネット アクセス許可があることを確認します。

      <uses-permission android:name="android.permission.INTERNET"/>

スナップショット。

ここに画像の説明を入力

于 2013-08-10T05:51:31.673 に答える
0

私は同じ例外を受け取りました:

 java.lang.NoClassDefFoundError: org.ksoap2.serialization.SoapObject at    
 com.example.soap_ksoap2_lino.MainActivity.onCreate(MainActivity.java:29)

code.google.com/p/ksoap2-android の .jar ファイルはコンパイル専用だと思います。クラスはありません。他のすべての .jar も機能しません。私は KSOAP2 API 戦略を放棄し、.jar が既に Eclipse ADT に存在する HttpPost を使用しようとしています。

ここに私のコードがあります: Sending SOAP request from Android. サーバーの応答: 「サーバーは要求を処理できませんでした。」

w3schools サーバーから応答を受信しましたが、サーバーは「サーバーは要求を処理できませんでした」と応答します。

于 2013-08-14T11:20:05.407 に答える