Java soap-HTTP错误400。请求的标头名称无效

Java soap-HTTP错误400。请求的标头名称无效,java,web-services,soap,Java,Web Services,Soap,我正在尝试使用以下代码请求web服务 HttpURLConnection conn = null; String operation = "validateAddress"; String urlStr = "http://....."; String requestXML = "<soapenv:Envelope " + "xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" " + "xm

我正在尝试使用以下代码请求web服务

HttpURLConnection conn = null;
String operation = "validateAddress";
String urlStr = "http://.....";
String requestXML = "<soapenv:Envelope "
        + "xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" "
        + "xmlns:v3=\"http://cio.att.com/commonheader/v3\" "
        + "xmlns:loc=\"http://ovalsgis.ebm.att.com/locationgeocoderservicerequest.xsd\">"
        + "<soapenv:Body>"
        + "<loc:validateGisAddressRequest "
        + "requestFlag=\"F\" "
        + "telcoFlag=\"N\">"
        + "<loc:FieldedAddressInfo>"
        + "    <loc:houseNumber>10</loc:houseNumber>   "
        + "    <loc:streetName>E MURPHY AVE</loc:streetName>  "
        + "    <loc:city>SAPULPA</loc:city>    "
        + "    <loc:state>OK</loc:state>    "
        + "    <loc:country>USA</loc:country>"
        + "</loc:FieldedAddressInfo>"
        + "</loc:validateGisAddressRequest>"
        + "</soapenv:Body>"
        + "</soapenv:Envelope>";

byte[] reqload = requestXML.getBytes();
URL server = new URL(urlStr.trim());
conn = (HttpURLConnection) server.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setAllowUserInteraction(false);
conn.setRequestProperty("Username", "abcTest");
conn.setRequestProperty("Password", "abcPassword");
conn.setRequestProperty("WSS-Password Type", "PasswordText");
conn.setRequestProperty("Content-Type", "text/xml");
String reqLen = Integer.toString(reqload.length);
conn.setRequestProperty("Content-Length", reqLen);
conn.setRequestProperty("SOAPAction", operation);
OutputStream os = conn.getOutputStream();
os.write(reqload);
os.flush();
logger.info("Received response Code (" + conn.getResponseCode() + ")");
HttpURLConnection conn=null;
字符串操作=“validateAddress”;
字符串urlStr=”http://.....";
String requestXML=“”
+ ""
+ ""
+ ""
+ "    10   "
+“E墨菲大道”
+“萨普帕”
+“好的”
+“美国”
+ ""
+ ""
+ ""
+ "";
byte[]reqload=requestXML.getBytes();
URL服务器=新URL(urlStr.trim());
conn=(HttpURLConnection)server.openConnection();
conn.setRequestMethod(“POST”);
连接设置输出(真);
conn.setDoInput(真);
conn.SETUSECHACHES(假);
conn.setAllowUserInteraction(假);
conn.setRequestProperty(“用户名”、“abcTest”);
conn.setRequestProperty(“密码”、“abcPassword”);
conn.setRequestProperty(“WSS密码类型”、“密码文本”);
conn.setRequestProperty(“内容类型”、“文本/xml”);
字符串reqLen=Integer.toString(reqload.length);
conn.setRequestProperty(“内容长度”,reqLen);
conn.setRequestProperty(“SOAPAction”,操作);
OutputStream os=conn.getOutputStream();
操作系统写入(重新加载);
os.flush();
info(“收到的响应代码(“+conn.getResponseCode()+”);
但我得到了以下回应:

错误的请求-无效的标头 HTTP错误400。请求的标头名称无效


有人能帮我吗?

您应该使用
javax.xml.soap
发出SAOP请求。 请看一看这本书

还有,可能会有帮助。

@fateddy

更新代码:

public class testWS {

public static void main(String args[]) throws Exception{
    HttpURLConnection conn = null;
    String operation = "validateGisAddress";
    String url = "http://.......";
    SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
    SOAPConnection soapConnection = soapConnectionFactory.createConnection();
    SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url);
    printSOAPResponse(soapResponse);
    soapConnection.close();


}
private static SOAPMessage createSOAPRequest() throws Exception {
    String requestXML = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:v3=\"http://cio.att.com/commonheader/v3\" xmlns:loc=\"http://ovalsgis.ebm.att.com/locationgeocoderservicerequest.xsd\"><soapenv:Body><loc:validateGisAddressRequest requestFlag=\"F\" telcoFlag=\"N\" username=\"?\" altLocationPropertiesIndicator=\"?\" superScore=\"?\"><!--You have a CHOICE of the next 2 items at this level--><loc:FieldedAddressInfo><!--Optional:-->       <loc:houseNumber>10</loc:houseNumber>            <loc:streetName>E MURPHY AVE</loc:streetName>            <loc:city>SAPULPA</loc:city>            <loc:state>OK</loc:state>            <loc:country>USA</loc:country></loc:FieldedAddressInfo></loc:validateGisAddressRequest></soapenv:Body></soapenv:Envelope>";
    InputStream is = new ByteArrayInputStream(requestXML.getBytes());
    SOAPMessage soapMessage = MessageFactory.newInstance().createMessage(null, is);
    String authorization = new sun.misc.BASE64Encoder().encode(("abcTest:abcPassword").getBytes());
    MimeHeaders hd = soapMessage.getMimeHeaders();
    hd.addHeader("Authorization", "Basic " + authorization);
    soapMessage.saveChanges();
    soapMessage.writeTo(System.out);

    return soapMessage;
}


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);
}
公共类testWS{
公共静态void main(字符串args[])引发异常{
HttpURLConnection conn=null;
字符串操作=“validateGisAddress”;
字符串url=”http://.......";
SOAPConnectionFactory SOAPConnectionFactory=SOAPConnectionFactory.newInstance();
SOAPConnection-SOAPConnection=soapConnectionFactory.createConnection();
SOAPMessage soapResponse=soapConnection.call(createSOAPRequest(),url);
打印soapResponse(soapResponse);
soapConnection.close();
}
私有静态SOAPMessage createSOAPRequest()引发异常{
String requestXML=“美国萨普尔帕墨菲大道10号”;
InputStream is=newbytearrayinputstream(requestXML.getBytes());
SOAPMessage SOAPMessage=MessageFactory.newInstance().createMessage(null,is);
字符串授权=new sun.misc.BASE64Encoder().encode(((“abcTest:abcPassword”).getBytes());
MimeHeaders hd=soapMessage.getMimeHeaders();
hd.addHeader(“授权”、“基本”+授权);
soapMessage.saveChanges();
soapMessage.writeTo(System.out);
返回消息;
}
私有静态void printSOAPResponse(SOAPMessage soapResponse)引发异常{
TransformerFactory TransformerFactory=TransformerFactory.newInstance();
Transformer Transformer=transformerFactory.newTransformer();
sourceContent=soapResponse.getSOAPPart().getContent();
System.out.print(“\n响应SOAP消息=”);
StreamResult结果=新的StreamResult(System.out);
transformer.transform(源内容、结果);
}

}

端点无法理解您的请求。使用SoapUI测试服务。对于实现,您应该使用一个SOAP库——在这里解释:@fateddy感谢您的回复。我忘了在帖子中提到,我已经用SoapUI测试了它,而且它运行得很好。我正在尝试使用上述SAAJ库,但无法通过身份验证详细信息。您能帮助我吗?您能更新您的代码(您正在使用SAAJ的地方)吗?也请发布wsdl。您应该编辑您的问题,而不是提供更新作为答案。请你这样做(并删除这个答案)好吗?还请添加wsdl。