2011-10-25 7 views
1

XMLを送信する指定されたURLにHTTPSポストを行うApache HttpClientライブラリを使用して小さなクラスを作成しようとしています。コードを実行すると、返されるHTTPステータス行は "403 Service Error"です。XMLをHTTPS URLにポストしようとするとHTTP 403サービスエラーが発生する

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私は関係していないように渡し、それがどんな同じエラーを与えない:

$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 

これは私が使用しているコードは次のとおりです。ここではHTMLが返される完全なエラーです。これは実際にはいくつかのURLで動作することに注意してください。たとえば、https://www.facebook.comと入力すると、それは処理されます。ただし、指定したURLでは機能しません。私は証明書の問題かもしれないと思って、証明書を信頼するためにいくつかのコードを追加しようとしました。どんな助けもありがとうございます。

答えて

0

レスポンスHTMLの最初の行にあるSocketTimeoutExceptionに基づいて、あなたが投稿しているURLのハンドラを実装するコンポーネントが、生成する必要があるソースシステムにいくつかの接続上の問題があると推測しています。応答データ。

基本的には、問題はサーバーではなくクライアントであるように見えます。

+0

奇妙なことは、ブラウザのリンクにアクセスしようとすると機能するということです。確かに、これはPOSTであり、ブラウザはGETを行いますが、それはまだ変です。 ColdFusionでは、キーストアに証明書を再インポートしなければならないため、いくつかの背景について言えば、基本的にColdFusionで作成されたCFHTTP呼び出しをこのJava呼び出しに置き換えようとしています。 Javaでは、証明書のエラーを無視するようなコードを書くことができるはずですが、私は証明書のエラーが発生するところまでいなくなっています。 – Rocket04

関連する問題