【问题标题】:Nav2009 web service through android?Nav2009 web service 通过android?
【发布时间】:2013-12-02 09:30:54
【问题描述】:

我正在尝试从 android 客户端访问 nav 2009 网络服务。

我尝试了ksoap2 库和jcifs 库。 ksoap2illegalargumentexception transport.calljcifsauthentication error

还有其他方法可以访问导航网络服务吗?

JCIFS:

protected Void doInBackground(String... arg0) {
        // TODO Auto-generated method stub


            String webserviceIP = "-------------"; // IP of the server.
            String username = "---------"; // Domain username
            String password ="--------"; // Domain password
            String deviceIP="" ;
            String domainName = "-----"; // Domain name


            DefaultHttpClient httpclient = new DefaultHttpClient();
            httpclient.getAuthSchemes().register("ntlm", new NTLMSchemeFactory());

            httpclient.getCredentialsProvider().setCredentials(new AuthScope(webserviceIP, -1), new NTCredentials(username, password, deviceIP, domainName));

            HttpGet httpGet = new HttpGet(URL);
            httpGet.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);

            HttpResponse response = null;
            try {
                response = httpclient.execute(httpGet);
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                String responseXML = EntityUtils.toString(response.getEntity());
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }



        return null;

    }

ksoap2:

                     SoapObject request=new SoapObject(NAMESPACE,METHOD_NAME);

                request.addProperty("No", arg0[0]);

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

                envelope.setOutputSoapObject(request);
                 HttpTransportSE transport = new HttpTransportSE(URL);
             try {
                transport.call(SOAP_ACTION, envelope);
            } catch (HttpResponseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (XmlPullParserException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
             //SoapObject result = (SoapObject) envelope.getResponse();

【问题讨论】:

  • 我不喜欢安卓。检查是否在 Web 服务设置 <add key="WebServicesUseNTLMAuthentication" value="true"></add>/ 中设置了正确的身份验证方法这可能是 authentication error 的问题。
  • 至于illegal argument,它可能意味着损坏的 XML(尝试从 XML 中擦除缩进,如果它存在的话)或缺少 SOAPAction 标头(我认为它对于 Nav WS 是强制性的)。
  • 对于非法参数异常@Mak,transport.call 方法将 size
  • 谢谢@MakSim。我检查了配置文件中的身份验证元素是假的。将其更改为真。Web 服务现在通过 jcifs 连接,但在 ksoap2 中出现相同的错误。我应该将身份验证添加到那个transport.call。
  • 它是否返回 HTTP 500 错误?这意味着您的 SOAP 请求不正确。在大多数情况下,Nav 会更新告诉您出了什么问题。尝试获取 envelope 变量中的内容,并尝试使用 SOAPui 等其他工具将其发送到 WS(只有夜间构建的 SOAPui 可以很好地与 Nav 配合使用)或将其发布在此处。

标签: android web-services navision


【解决方案1】:

据我所知,您的 XML 无效。它包含 ”;”例如标签之间。尝试生成正确的 XML。

您可以尝试以下方法:

  1. 运行 SOAPui(SNAPSHOT 构建支持 NTLM 身份验证)
  2. 使用 Nav WS(将 WSDL 的 URL 提供给 SOAPui)
  3. 生成示例 XML 请求(有一个命令)
  4. 删除每行末尾的不可打印字符。那些由应用程序添加的,对我来说它看起来像一个错误,Nav 也不喜欢它们。
  5. 删除<v:Header /><v:Body> 之间的所有字符,包括CR。 Nav WS 中似乎存在错误。
  6. 为请求插入参数。
  7. 运行请求。

如果出现错误,请修复它们并使请求生效。在您处理 XML 请求后,强制您的任何库生成相同的请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    相关资源
    最近更新 更多