Web Services 标头不工作的SOAP Web服务调用

neskvpey  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(224)

bounty将在5天后过期。回答此问题可获得+100声望奖励。coder希望引起更多人关注此问题。

我尝试使用凭据用户名和密码调用SOAP Web服务,但它给出错误,我尝试了不同的方法,但输出相同,它给出以下错误:
//错误

expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <html>@2:44 in java.io.InputStreamReader@54570a0)

不返回响应。
//变量
x一个一个一个一个一个x一个一个二个一个x一个一个三个一个x一个x一个x一个x一个x一个x一个

2w2cym1i

2w2cym1i1#

您可以通过两种方式验证Web服务调用:

  • 一方面,您可以在消息级别验证您的Web服务调用,就像在代码中一样,包括必要的WS-Security相关头。
  • 另一方面,Web服务调用可以在传输层进行身份验证,通常使用HTTP/S传输协议和Authorization报头。

这两种身份验证机制实际上是互补的,使用哪种机制取决于Web服务提供者。
在我看来,Web服务的提供者至少希望在传输层进行身份验证,当您发送没有必要标头的SOAP请求时,它将返回一个401 HTML页面,这将导致您所描述的错误:

expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <html>@2:44 in java.io.InputStreamReader@54570a0)

根据this related SO question,您可以提供必要的头文件,内容如下:

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

// add header to envelope
envelope.headerOut = getHeaderElement();

System.out.println("HeaderValue " + Arrays.toString(envelope.headerOut));

envelope.dotNet = false;
envelope.bodyOut = request;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
System.out.println("BodyOut " + envelope.bodyOut.toString());

androidHttpTransport.debug = true;

// Note the inclusion of the required headers
List<HeaderProperty> headerList = new ArrayList<HeaderProperty>();
headerList.add(new HeaderProperty(
        "Authorization",
        "Basic " + org.kobjects.base64.Base64.encode((USER_NAME + ":" + PASSWORD).getBytes())
        // Or, using android.util.Base64
        // "Basic " + Base64.encodeToString((USER_NAME + ":" + PASSWORD).getBytes(), Base64.DEFAULT)
));

androidHttpTransport.call(SOAP_ACTION, envelope, headerList);

SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
System.out.println("ResponseMessage" +  response.toString());
responseMsg = String.valueOf(response);
System.out.println("ResponseMessage" +  response.toString());

相关问题