【问题标题】:Android Studio Webservice call "HTTP request failed, HTTP status: 401" UnauthorizedAndroid Studio Webservice 调用“HTTP 请求失败,HTTP 状态:401”未经授权
【发布时间】:2015-03-31 16:29:35
【问题描述】:

我尝试将我的 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);
    }
}

我有一个类,我想在其中调用 Web 服务

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";
        }
    }
}

我已经在 Manifest 文件中设置了使用权限

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

在我的 MainActivity 中,我是否使用按钮执行 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

我用谷歌搜索了一整天,但我还没有解决问题。 有没有人可以帮助我,或者可以给我提示我必须搜索的地方?

【问题讨论】:

  • 您是否已成功使用其他地方的凭据,例如浏览器或提琴手/wireshark / 等?
  • 是的,我可以用 Internet Explorer 调用 WS

标签: android web-services authentication call unauthorized


【解决方案1】:

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

Android Consuming Dynamics NAV SOAP Web Service

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

【讨论】:

    【解决方案2】:

    就我而言,我通过添加以下代码解决了同样的问题:

    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/

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 1970-01-01
      • 2011-03-18
      • 2012-06-30
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      相关资源
      最近更新 更多