Android Studio Webservice调用" HTTP请求失败,HTTP状态:401"擅自

时间:2015-03-31 16:29:35

标签: android web-services authentication call unauthorized

我尝试将我的Android应用程序连接到Web服务。 我写了一个新类并定义了一些变量:

我有异步类使用网络

class GetValueTask extends AsyncTask<ApiConnector,Long,String> {
    @Override
    protected String doInBackground(ApiConnector... params) {
        //wird im Background Thread ausgeführt
        return  params[0].getValue();

    }

    @Override
    protected void onPostExecute(String s) {
        //wird im Mainthread ausgeführt
        MainActivity.this.setText(s);
    }
}

我有一个Class,我想调用Webservice

public class ApiConnector
{
    private static final String SOAP_ACTION ="urn:microsoft-dynamics-schemas/codeunit/AddService:Add";
    private static final String METHOD_NAME ="Add";
    private static final String NAMESPACE ="urn:microsoft-dynamics-schemas/codeunit/AddService";
    private static final String URL ="http://192.168.0.154:9047/DynamicsNAV80/WS/CRONUS%20AG/Codeunit/AddService";
    private static final String USERNAME="B.Denger";
    private static final String PASSWORD ="TestPW123!";



    public String getValue() {

        SoapObject request = new SoapObject(NAMESPACE,METHOD_NAME);
        request.addProperty("no","10");

        PropertyInfo unamePI = new PropertyInfo();
        PropertyInfo passPI = new PropertyInfo();
        // Set Username
        unamePI.setName("username");
        // Set Value
        unamePI.setValue(USERNAME);
        // Set dataType
        unamePI.setType(String.class);
        // Add the property to request object
        request.addProperty(unamePI);
        //Set Password
        passPI.setName("password");
        //Set dataType
        passPI.setValue(PASSWORD);
        //Set dataType
        passPI.setType(String.class);
        //Add the property to request object
        request.addProperty(passPI);

        SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);

        soapEnvelope.setOutputSoapObject(request);

        HttpTransportSE aht= new HttpTransportSE(URL);

        try {
            aht.call(SOAP_ACTION, soapEnvelope);
            SoapPrimitive resultString = (SoapPrimitive) soapEnvelope.getResponse();
            return resultString.toString();
        }catch(Exception e ) {
            e.printStackTrace();
            return "Fail at Call";
        }
    }
}

我在清单文件中设置了使用权限

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

在我的MainActivity中,我是否使用Button

执行AsynkTask
 btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            GetValueTask getValueTask = new GetValueTask();
            getValueTask.execute(new ApiConnector());
        }
    });

执行后我得到以下Logcat条目:

W/System.err﹕ org.ksoap2.transport.HttpResponseException: HTTP request failed, HTTP status: 401
我用Google搜索了一整天,但我还没有解决问题。 有没有人可以帮助我,或者可以给我一个提示,我必须搜索?

2 个答案:

答案 0 :(得分:0)

我在这里找到了解决方案:

Android Consuming Dynamics NAV SOAP Web Service

但它不适用于jcifs 1.3.17 jar 在https://jcifs.samba.org/src/可以下载最新版本。

答案 1 :(得分:0)

在我的情况下,我通过添加此代码修复了同样的问题:

List<HeaderProperty> llstHeadersProperty = new ArrayList<>();
llstHeadersProperty.add(new HeaderProperty("Authorization", "Basic " + org.kobjects.base64.Base64.encode("user:password".getBytes())));
loHttpTransport.call(sSOAP_ACTION, loEnvelope, llstHeadersProperty);

完成任务:

private class fnAsyncTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params)
        {
            //for linear parameter
            SoapObject loRequest = new SoapObject(sNAMESPACE, sMETHOD_NAME);
            // adding method property here serially
//            loRequest.addProperty("CountryName", "france");

            SoapSerializationEnvelope loEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            loEnvelope.implicitTypes = true;
            loEnvelope.setOutputSoapObject(loRequest);
            loEnvelope.dotNet = true;


            HttpTransportSE loHttpTransport = new HttpTransportSE(_sURL);
            loHttpTransport.debug = true;
            try
            {
                List<HeaderProperty> llstHeadersProperty = new ArrayList<>();
                llstHeadersProperty.add(new HeaderProperty("Authorization", "Basic " + org.kobjects.base64.Base64.encode("user:password".getBytes())));
                loHttpTransport.call(sSOAP_ACTION, loEnvelope, llstHeadersProperty);
            }
            catch (HttpResponseException e)
            {
                // TODO Auto-generated catch block
                Log.e("HTTPLOG", e.getMessage());
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                Log.e("IOLOG", e.getMessage());
                e.printStackTrace();
            } catch (XmlPullParserException e) {
                // TODO Auto-generated catch block
                Log.e("XMLLOG", e.getMessage());
                e.printStackTrace();
            } //send request

            Object result = null;
            try {
                result = (Object )loEnvelope.getResponse();
                //See output in the console
                Log.i("RESPONSE",String.valueOf(result));
            } catch (SoapFault e) {
                // TODO Auto-generated catch block
                Log.e("SOAPLOG", e.getMessage());
                e.printStackTrace();
            }
            return null;
        }
    }

完整的例子 http://www.nascenia.com/consuming-soap-web-services-from-android/