Java 尝试将XML发布到HTTPS URL时出现HTTP 403服务错误

Java 尝试将XML发布到HTTPS URL时出现HTTP 403服务错误,java,https,httpclient,Java,Https,Httpclient,我正在尝试使用ApacheHttpClient库编写一个小类,它将向指定的URL发送HTTPS post,并发送一些XML。当我运行代码时,我收到的HTTP状态行是“403服务错误”。以下是HTML返回的完整错误: $errorDump java.net.SocketTimeoutException:Read timed out $errorInfo $errorDump java.net.SocketTimeoutException:Read timed out $error Rea

我正在尝试使用ApacheHttpClient库编写一个小类,它将向指定的URL发送HTTPS post,并发送一些XML。当我运行代码时,我收到的HTTP状态行是“403服务错误”。以下是HTML返回的完整错误:

$errorDump  java.net.SocketTimeoutException:Read timed out
$errorInfo  
$errorDump  java.net.SocketTimeoutException:Read timed out
$error  Read timed out
$localizedError Read timed out
$errorType  java.net.SocketTimeoutException
$user   
$time   2011-10-25 09:39:29 EDT
$error  Read timed out
$errorType  java.net.SocketTimeoutException
这是我正在使用的代码:

import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public class HttpXmlPost {

    public static void main(String[] args)
    {
        String url = "https://someurlhere.com";
        String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><xmlTag></xmlTag>";

        String content = request(xmlStr, url);
        System.out.println(content);
    }

    private static String request(String xmlStr, String url) {
        boolean success = false;
        String content = "";

        HttpClient httpclient = new DefaultHttpClient();

        try {
            HttpPost httpPost = new HttpPost(url.trim());

            InputStreamEntity reqEntity = new InputStreamEntity(new ByteArrayInputStream(xmlStr.getBytes() ), -1);
            reqEntity.setContentType("application/xml");
            reqEntity.setChunked(true);

            httpPost.setEntity(reqEntity);

            System.out.println("Executing request " + httpPost.getRequestLine());
            HttpResponse response = httpclient.execute(httpPost);
            HttpEntity resEntity = response.getEntity();

            System.out.println("----------------------------------------");
            System.out.println(response.getStatusLine());
            if(response.getStatusLine().getStatusCode() == 200){
                success = true;
            }
            if (resEntity != null) {
                System.out.println("Response content length: " + resEntity.getContentLength());
                System.out.println("Chunked?: " + resEntity.isChunked());
            }

            BufferedReader reader = new BufferedReader(new InputStreamReader(resEntity.getContent()));
            StringBuilder buf = new StringBuilder();
            char[] cbuf = new char[ 2048 ];
            int num;

            while ( -1 != (num=reader.read( cbuf ))) {
                buf.append( cbuf, 0, num );
            }

            content = buf.toString();

            EntityUtils.consume(resEntity);
        } 
        catch (Exception e) {
            System.out.println(e);
        }
        finally {
            httpclient.getConnectionManager().shutdown();
        }

        return content;
    }
}
import java.io.ByteArrayInputStream;
导入java.io.InputStreamReader;
导入java.io.BufferedReader;
导入org.apache.http.HttpEntity;
导入org.apache.http.HttpResponse;
导入org.apache.http.client.HttpClient;
导入org.apache.http.client.methods.HttpPost;
导入org.apache.http.entity.InputStreamEntity;
导入org.apache.http.impl.client.DefaultHttpClient;
导入org.apache.http.util.EntityUtils;
公共类HttpXmlPost{
公共静态void main(字符串[]args)
{
字符串url=”https://someurlhere.com";
字符串xmlStr=“”;
字符串内容=请求(xmlStr,url);
系统输出打印项次(内容);
}
私有静态字符串请求(字符串xmlStr、字符串url){
布尔成功=假;
字符串内容=”;
HttpClient HttpClient=新的DefaultHttpClient();
试一试{
HttpPost=newhttppost(url.trim());
InputStreamEntity reqEntity=new InputStreamEntity(new ByteArrayInputStream(xmlStr.getBytes()),-1);
requentity.setContentType(“应用程序/xml”);
reqEntity.setChunked(真);
httpPost.setEntity(reqEntity);
System.out.println(“正在执行请求”+httpPost.getRequestLine());
HttpResponse response=httpclient.execute(httpPost);
HttpEntity当前性=response.getEntity();
System.out.println(“--------------------------------------------------------”;
System.out.println(response.getStatusLine());
if(response.getStatusLine().getStatusCode()==200){
成功=真实;
}
if(最近性!=null){
System.out.println(“响应内容长度:+resEntity.getContentLength());
System.out.println(“Chunked?:”+resEntity.isChunked());
}
BufferedReader=new BufferedReader(new InputStreamReader(resEntity.getContent());
StringBuilder buf=新的StringBuilder();
char[]cbuf=新字符[2048];
int-num;
而(-1!=(num=reader.read(cbuf))){
追加(cbuf,0,num);
}
content=buf.toString();
实体效用消耗(最近);
} 
捕获(例外e){
系统输出打印ln(e);
}
最后{
httpclient.getConnectionManager().shutdown();
}
返回内容;
}
}
无论我传入什么XML似乎都无关紧要,不管发生什么,它都会给出相同的错误。请注意,这实际上适用于某些URL。例如,如果我把它放进去,它就会通过。但是,它不适用于我指定的URL。我认为这可能是一个证书问题,试图添加一些代码来信任任何证书,但似乎也不起作用,尽管我可能做错了。非常感谢您的帮助。

根据响应HTML第一行中的内容,我猜实现您要发布的URL处理程序的组件与生成响应数据所需的源系统之间存在一些连接问题


基本上,问题似乎出在服务器上,而不是你的客户端。

奇怪的是,如果我尝试只访问浏览器中的链接,它就会工作。诚然,这是一篇文章,浏览器也会有一个GET,但它仍然很奇怪。为了提供更多的背景信息,我基本上尝试将在ColdFusion中进行的CFHTTP调用替换为这个Java调用,因为使用ColdFusion,我必须始终为某些URL将证书重新导入密钥库,这是不实际的。使用Java,我应该能够编写一些代码来忽略证书错误,但我甚至还没有达到证书错误的程度。