Ошибка службы HTTP 403 при попытке отправить XML на HTTPS URL

#java #https #httpclient

#java #https #httpclient

Вопрос:

Я пытаюсь написать небольшой класс, используя библиотеку Apache HttpClient, которая выполняла бы HTTPS post на указанный URL-адрес, отправляя некоторый 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;
    }
}
 

Какой бы XML я ни передавал, это, похоже, не имеет значения, он выдает ту же ошибку, несмотря ни на что. Обратите внимание, что это действительно работает с некоторыми URL-адресами. Например, если я помещу https://www.facebook.com , это проходит насквозь. Однако это не работает для моего указанного URL. Я подумал, что это может быть проблема с сертификатом, попытался добавить некоторый код для доверия любому сертификату, похоже, тоже не сработало, хотя, возможно, я сделал это неправильно. Любая помощь приветствуется.

Ответ №1:

Основываясь SocketTimeoutException на первой строке HTML-кода ответа, я предполагаю, что у компонента, который реализует обработчик для URL-адреса, на который вы отправляете, возникли некоторые проблемы с подключением к исходной системе, необходимой для генерации данных ответа.

В принципе, похоже, что проблема на сервере, а не на вашем клиенте.

Комментарии:

1. Что странно, так это то, что если я попытаюсь просто перейти по ссылке в браузере, это сработает. Конечно, это СООБЩЕНИЕ, и браузер выполняет GET, но все равно это странно. Чтобы дать еще немного информации, я в основном пытаюсь заменить вызов CFHTTP, выполненный в ColdFusion, на этот вызов Java, потому что с ColdFusion мне постоянно приходится повторно импортировать сертификаты в хранилище ключей для некоторых URL-адресов, что нецелесообразно. С Java я должен быть в состоянии закодировать что-то, чтобы игнорировать ошибки сертификата, но я даже не дохожу до того момента, когда получаю ошибку сертификата.