Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Twinfield-服务器无法识别HTTP标头SOAPAction的值_Java_Web Services_Soap_Soap Client - Fatal编程技术网

Java Twinfield-服务器无法识别HTTP标头SOAPAction的值

Java Twinfield-服务器无法识别HTTP标头SOAPAction的值,java,web-services,soap,soap-client,Java,Web Services,Soap,Soap Client,我正在尝试通过Java连接。我试过的代码是 import java.net.URL; import javax.xml.namespace.QName; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPBodyElement; import javax.xml.soap.SOAPConnection; import javax.xml.soap.SOAP

我正在尝试通过Java连接。我试过的代码是

import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.MimeHeaders;
import java.io.ByteArrayInputStream;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;

public class SoapTest {

    public static void main(String[] args) {
        try {
            SOAPConnectionFactory sfc = SOAPConnectionFactory.newInstance();
            SOAPConnection connection = sfc.createConnection();

            MessageFactory mf = MessageFactory.newInstance();
            SOAPMessage sm = mf.createMessage();

            SOAPHeader sh = sm.getSOAPHeader();
            SOAPBody sb = sm.getSOAPBody();
            //sh.detachNode();
            QName logonName = new QName("http://www.twinfield.com", "Logon");
            SOAPBodyElement logonElement = sb.addBodyElement(logonName);

            QName userTag = new QName("user");
            SOAPElement user = logonElement.addChildElement(userTag);
            user.addTextNode("myuser");

            QName passwordTag = new QName("password");
            SOAPElement password = logonElement.addChildElement(passwordTag);
            password.addTextNode("mypassword");

            QName organisationTag = new QName("organisation");
            SOAPElement organisation = logonElement.addChildElement(organisationTag);
            organisation.addTextNode("myorg");

            System.out.println("\n Soap Request:\n");
            sm.writeTo(System.out);
            System.out.println();

            URL endpoint = new URL("https://login.twinfield.com/webservices/session.asmx");
            SOAPMessage response = connection.call(sm, endpoint);

            connection.close();

            //System.out.println(response.getContentDescription());
            //System.out.println("--------------------------");

            // Reading response
            printSOAPResponse(response);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private static void printSOAPResponse(SOAPMessage soapResponse) throws Exception {
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        Source sourceContent = soapResponse.getSOAPPart().getContent();
        System.out.print("\nResponse SOAP Message = ");
        StreamResult result = new StreamResult(System.out);
        transformer.transform(sourceContent, result);
    }   
}
看起来一切都是正确的,但我经常收到响应
服务器没有识别HTTP头SOAPAction:。
。以上程序的完整输出如下:

java SoapTest

 Soap Request:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
    <SOAP-ENV:Body>
        <Logon xmlns="http://www.twinfield.com">
            <user>NLG001136</user>
            <password>qura976yj</password>
            <organisation>TWF-SAAS</organisation>
        </Logon>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Response SOAP Message = 
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Client</faultcode>
            <faultstring>Server did not recognize the value of HTTP Header SOAPAction: .</faultstring>
            <detail/>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>
javasoaptest
Soap请求:
NLG001136
qura976yj
TWF-SAAS
响应SOAP消息=
soap:客户端
服务器未识别HTTP标头SOAPAction:的值。

相同的请求/凭据可以正常工作。有人能指出我的程序哪里出了问题吗

由于故障代码是客户机,因此是您发送的soap消息导致了问题。尝试使用SOAPUI传递相同的消息,我尝试将WSDL导入到我的SOAPUI中,但出现附加错误

加载[:org.apache.xmlbeans.XmlException:org.apache.xmlbeans.XmlException:Error:不关闭标记时出错

由于webservice expopsed是文档/文字包装的,只需尝试使用wsimport创建客户端代码,您就可以拥有所有需要的文件,并且很容易发送相同的请求

如果您只是对SAAJ方式感兴趣,那么我将尝试通过SOAP UI传递创建的消息


希望这有帮助。

最好按照Twinfield的建议使用Twinfield Openid oAuth进行身份验证。要建立初始连接,请检查以下链接

完成初始连接设置和访问令牌后,您可以继续获取公司列表。将Twinfield webservices与访问令牌结合使用时,需要在请求标头中提供公司id或公司代码。 首先,使用

您可以使用以下代码请求获取公司列表

package example;

import com.user.defined.package.twinfield.Header;
import com.user.defined.package.twinfield.ObjectFactory;
import com.user.defined.package.twinfield.ProcessXml;
import com.user.defined.package.twinfield.ProcessXmlSoap;
import com.sun.xml.internal.ws.developer.WSBindingProvider;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.soap.SOAPException;


public class HelloWorldClient {
 public static void main(String[] argv) throws JAXBException, SOAPException {


     ProcessXml processXmlService = new ProcessXml();
     ProcessXmlSoap processXmlSoap = processXmlService.getProcessXmlSoap();


     WSBindingProvider bp = (WSBindingProvider)processXmlSoap;

     JAXBContext jaxbContext = JAXBContext.newInstance(Header.class);
     Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
     jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);


     ObjectFactory objectFactory = new ObjectFactory();
     Header header = new Header();
     //active access token
     header.setAccessToken("95cd6bb91a59751....................");

     JAXBElement<Header> jaxbElement = objectFactory.createHeader(header);

     //Just to check the soap header 
     jaxbMarshaller.marshal(jaxbElement, System.out);

     //Set it to the bindingprovider
     bp.setOutboundHeaders(
             jaxbElement
     );


     String xmlRequest = "<list><type>offices</type></list>";
     System.out.println(processXmlSoap.processXmlString(xmlRequest));
  }
}
包示例;
导入com.user.defined.package.twinfield.Header;
导入com.user.defined.package.twinfield.ObjectFactory;
导入com.user.defined.package.twinfield.ProcessXml;
导入com.user.defined.package.twinfield.ProcessXmlSoap;
导入com.sun.xml.internal.ws.developer.WSBindingProvider;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.JAXBElement;
导入javax.xml.bind.JAXBException;
导入javax.xml.bind.Marshaller;
导入javax.xml.soap.SOAPException;
公共类HelloWorldClient{
publicstaticvoidmain(字符串[]argv)抛出jaxbeexception、SOAPException{
ProcessXml processXmlService=新的ProcessXml();
ProcessXmlSoap ProcessXmlSoap=processXmlService.getProcessXmlSoap();
WSBindingProvider bp=(WSBindingProvider)processXmlSoap;
JAXBContext JAXBContext=JAXBContext.newInstance(Header.class);
Marshaller jaxbMarshaller=jaxbContext.createMarshaller();
setProperty(Marshaller.JAXB_格式化的_输出,Boolean.TRUE);
ObjectFactory ObjectFactory=新的ObjectFactory();
页眉=新页眉();
//主动访问令牌
header.setAccessToken(“95cd6bb91a59751”);
JAXBElement=objectFactory.createHeader(header);
//只是为了检查soap头
jaxbMarshaller.marshall(jaxbElement,System.out);
//将其设置为bindingprovider
bp.setOutboundHeaders(
贾斯贝尔蒙
);
字符串xmlRequest=“办公室”;
System.out.println(processXmlSoap.processXmlString(xmlRequest));
}
}

奖励赏金作为唯一的答案。虽然我的问题现在已经解决,答案给我指示,但这不是一个完整的答案,所以不接受答案。