7

以下のAndroidアプリコードがあります。HTTP 経由で Web サービスに接続しようとしています。Web サービスは Apache 軸を使用します。ただし、応答で「Error reading XMLStreamReader」というエラーが発生します。私は本当に立ち往生していて、何ができるかわからない. サーバー側とクライアント側で使用されている HTTP クライアントと SOAP のバージョンが異なる可能性がありますか?? これに関するヘルプは大歓迎です。Web サービスは非常に単純です。sayHello メソッドは、arg0=some_string で指定された引数を表示します。

public class MainActivity extends Activity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

    BufferedReader in = null;
    try {
        HttpClient client = new DefaultHttpClient();
        HttpPost request = new HttpPost(
                "http://10.0.0.63:8080/archibus/cxf/HelloWorld/sayHello");
        request.addHeader("Content-Type", "text/xml");
        List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
        postParameters.add(new BasicNameValuePair("arg0", "testing"));
        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
        request.setEntity(formEntity);

        HttpResponse response = client.execute(request);

        in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        StringBuffer sb = new StringBuffer("");
        String line = "";
        String NL = System.getProperty("line.separator");
        while ((line = in.readLine()) != null) {
            sb.append(line + NL);
        }
        in.close();

        String page = sb.toString();
        // Log.i(tag, page);
        System.out.println(page);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
}
4

3 に答える 3

9

WebService リクエストが正しく構成されていません。実際に作成しているのはフォーム リクエストであり、実際の SOAP リクエストではありません。

SOAP リクエストは、エンベロープと本文を持つ XML ドキュメントです。例は、ウィキペディアの SOAP メッセージの例 を参照してください。

ここで実際に行っているのは、送信フォームをエミュレートする標準 HTTP 呼び出しであり、SOAP 呼び出しではありません。

ここには 2 つの解決策があります。

1- XML ドキュメントを手動で作成して送信することにより、SOAP クライアントの動作をエミュレートできます。適切な XML ドキュメントをリクエスト本文として設定する以外に、適切なヘッダーを設定することを忘れないでください: SOAPAction、Content-Type、および Content-Length

RequestEntity requestEntity = new StringRequestEntity("<?xml version=\"1.0\"?><soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\"><soap:Header></soap:Header><soap:Body><m:GetStockPrice xmlns:m=\"http://www.example.org/stock\"><m:StockName>IBM</m:StockName></m:GetStockPrice></soap:Body></soap:Envelope>");
    post.setRequestEntity(requestEntity );

また、上記の名前空間 (m) を、Web サービスが使用している適切な名前空間に変更することを忘れないでください。および操作名 ( GetStockPrice ) と、呼び出そうとしている操作。パラメータの名前と型も忘れないでください。

2- Apache Axis を使用してクライアントを生成し、そのクライアントをアプリケーションで使用できます

詳細と推奨されるクライアントについては、このスレッドを参照してくださいAndroid で SOAP Web サービスを呼び出す方法

于 2012-10-11T04:42:15.197 に答える
2

Shoukry Kは正しいです。HTTP POST リクエストを実行しました。これは SOAP Web サービスではありません。Web サービスを呼び出す方法を知りたい場合は、リンクをたどってください。http://www.youtube.com/watch?v=v9EowBVgwSo . 必ず最新の ksoap jar ファイルをダウンロードしてください。

于 2012-10-14T17:46:05.253 に答える
1

K-SOAP for Android を使ったサンプルコードです。

private void sendSOAPmsg(DamageAssessmentFormPojo pojo) throws IOException, XmlPullParserException, SoapFault {
        SoapObject request = new SoapObject(WEBSERVICE.NAMESPACE, WEBSERVICE.METHOD_NAME_SUBMIT_REPORT);
        request.addProperty("xmlBytes", Util.getSoapBase64String(pojo));
        request.addProperty("fileName", IO.DefaultReportName);
        request.addProperty("deviceId", AppConstants.IMEI != null ? AppConstants.IMEI : Util.getIMEI(this));

        SoapPrimitive response = sendSOAPEnvelope(request, WEBSERVICE.SOAP_ACTION_SUBMIT_REPORT);

        if (response.toString().equalsIgnoreCase("true")) {
            Logger.logInfo("REPORT SENT SUCCESSFULLY", "WEB-SERVICE");
            pojo.setReportSent(true);
            IO.writeObject(pojo.getReportsFolderPath() + IO.DefaultReportName, pojo);
        } else {
            Logger.logInfo("REPORT SENT FAILED", "WEB-SERVICE - RESONSE " + response.toString());
        }
    }

    private SoapPrimitive sendSOAPEnvelope(SoapObject request, String soapAction) throws IOException, XmlPullParserException, SoapFault {
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(WEBSERVICE.URL);

        androidHttpTransport.call(soapAction, envelope);
        SoapPrimitive response = (SoapPrimitive) envelope.getResponse();

        return response;

    }

    private boolean sendSOAPimage(String strImg, File pFile) throws IOException, XmlPullParserException {
        boolean result = false;

        if (strImg != null) {
            SoapObject request = new SoapObject(WEBSERVICE.NAMESPACE, WEBSERVICE.METHOD_NAME_SUBMIT_IMAGE);
            request.addProperty("imageBytes", strImg);
            request.addProperty("fileName", pFile.getName());
            request.addProperty("deviceId", AppConstants.IMEI != null ? AppConstants.IMEI : Util.getIMEI(this));

            SoapPrimitive response = sendSOAPEnvelope(request, WEBSERVICE.SOAP_ACTION_SUBMIT_MAGE);

            if (response.toString().equalsIgnoreCase("true")) {

                result = true;

                Logger.logInfo("IMAGE SENT SUCCESSFULLY", "WEB-SERVICE");

            } else {
                Logger.logInfo("IMAGE SENT FAILED", "WEB-SERVICE - RESONSE " + response.toString());
            }

        }

        return result;
    }

//--------Util ヘルパー メソッド

public static String getSoapBase64String(DamageAssessmentFormPojo pojo) {


        XmlSerializer xmlSerializer = Xml.newSerializer();
        StringWriter writer = new StringWriter();

        try {
            xmlSerializer.setOutput(writer);
            xmlSerializer.startDocument("UTF-8", true);

            xmlSerializer.startTag("", XMLTags.TAG_ROD);
            xmlSerializer.startTag("", XMLTags.TAG_ORDER);

            xmlSerializer.startTag("", XMLTags.TAG_SEVERITY);
            xmlSerializer.text(pojo.getCheckedSeverity_Complexity());
            xmlSerializer.endTag("", XMLTags.TAG_SEVERITY);

            xmlSerializer.startTag("", XMLTags.TAG_DAMAGE_TYPE);
            StringBuilder builder = new StringBuilder();
            for (String str : pojo.getCheckedDamageTypes()) {

                builder.append(str + " , ");

            }
            xmlSerializer.text(builder.toString());
            xmlSerializer.endTag("", XMLTags.TAG_DAMAGE_TYPE);

            xmlSerializer.startTag("", XMLTags.TAG_ENV_IMPACT);
            xmlSerializer.text(pojo.getCheckedEnvImpact());
            xmlSerializer.endTag("", XMLTags.TAG_ENV_IMPACT);

            xmlSerializer.startTag("", XMLTags.TAG_ENV_COMMENT);
            xmlSerializer.text(pojo.getEnvImpactComments());
            xmlSerializer.endTag("", XMLTags.TAG_ENV_COMMENT);

            xmlSerializer.startTag("", XMLTags.TAG_TRAVEL_CONDITION);
            xmlSerializer.text(pojo.getCheckedTravelCond());
            xmlSerializer.endTag("", XMLTags.TAG_TRAVEL_CONDITION);

            xmlSerializer.startTag("", XMLTags.TAG_TRAVEL_COMMENT);
            xmlSerializer.text(pojo.getTravCondComments());
            xmlSerializer.endTag("", XMLTags.TAG_TRAVEL_COMMENT);

            xmlSerializer.startTag("", XMLTags.TAG_ORDER_DATE);
            xmlSerializer.text(pojo.getDateTime());
            xmlSerializer.endTag("", XMLTags.TAG_ORDER_DATE);

            xmlSerializer.endTag("", "Order");
            xmlSerializer.endTag("", "ROD");

            xmlSerializer.endDocument();

        } catch (IllegalArgumentException e) {
            Logger.logException(e);
        } catch (IllegalStateException e) {
            Logger.logException(e);
        } catch (IOException e) {
            Logger.logException(e);
        }

        return Base64.encode(writer.toString().getBytes());
    }
于 2012-10-15T07:52:30.743 に答える