2011-03-01 27 views
8

私はJavaで小さなプロジェクトを開始しました。
xmlをURLにHTTP POSTリクエストとして送信するクライアントを作成する必要があります。
私はjava.net.*パッケージを使用して、それを試してみてください(以下は、コードの一部である)が、以下のように、私はエラーを取得しています:以下のようにWebサービス呼び出しでエラー500が返される

java.io.IOException: Server returned HTTP response code: 500 for URL: "target url" 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441) 
    at newExample.main(newExample.java:36) 

私のコードは次のとおりです。

try { 
     URL url = new URL("target url"); 

     URLConnection connection = url.openConnection(); 

     if(connection instanceof HttpURLConnection) 
      ((HttpURLConnection)connection).setRequestMethod("POST"); 

     connection.setRequestProperty("Content-Length", Integer.toString(requestXml.length())); 
     connection.setRequestProperty("Content-Type","text/xml; charset:ISO-8859-1;"); 
     connection.setDoOutput(true); 
     connection.connect();   

     // Create a writer to the url 
     PrintWriter writer = new PrintWriter(new 
     OutputStreamWriter(connection.getOutputStream())); 

     // Get a reader from the url 
     BufferedReader reader = new BufferedReader(new 
     InputStreamReader(connection.getInputStream())); 

     writer.println(); 
     writer.println(requestXml); 
     writer.println(); 
     writer.flush(); 

     String line = reader.readLine(); 
      while(line != null) { 
        System.out.println(line); 
        line = reader.readLine(); 
      } 


    } catch (MalformedURLException e) { 
        e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

適当な例で助けたりしてくださいこれを行う他の方法。

上記のコードまたは他の可能性のある箇所の誤り/間違い。

私のWebサービスは、Springフレームワークに送信するために

XMLは、文字列の形式になっている。requestXml

+0

HTTPエラー500は、「内部サーバーエラー」です。サービスでエラーが発生した場合、または例外がスローされた場合に返される汎用エラーです。完全な応答本文を読んで、さらなる情報があるかどうかを確認することができます。 –

+0

エラーコード500が内部サーバーエラーです。ですから、私はクライアントよりもむしろサーバーに集中しています。 – sfussenegger

+0

URLが正しい場合(ブラウザから確認できます)、できることはあまりありません。サーバー側のエラーのように見えます。 – Nishant

答えて

3

問題は、サーバーコードまたはサーバー構成内にある:

10.5.1 500内部サーバーエラー

サーバーが予期しない条件に遭遇し、r平等。

w3c.org/Protocols

サーバーがあなたのコントロール下にある場合(私は [編集前] URL を見れば、する必要があります)、その後、サーバーのログを見てみましょう。

1

ストリームと接続を閉じる必要があります。 Java 7の自動リソース管理またはhttp://projectlombok.org/が役立ちます。しかし、これは主な問題ではないでしょう。

主な問題は、サーバー側で障害が発生することです。 HTTPコード500はサーバー側のエラーを意味します。理由を教えてもらえません。サーバー側の部分がわからないからです。サーバーのログを確認する必要があります。

1

出力ストリームを書き込んだり閉じたりする前に入力ストリームを開いていることが問題だと思います。確かに、Sun Tutorialはそうです。

入力ストリームをあまりに早く開くと、出力ストリームが自動的に閉じられ、サーバーに空のPOST要求が表示される可能性があります。これは、混乱して500応答を送信するのに十分である可能性があります。

これは500エラーの原因ではない場合でも、チュートリアルで設定されている順序で作業することをお勧めします。最初は、リクエストの書き込みが完了する前に誤って応答を読むと、(少なくとも一時的に)接続をロックする可能性が高くなります。 (実際には、読者から読まれる前にライターを閉じていないので、コードがこれを行っているように見えます)。

別の問題は、あなたのコードがすべての状況で接続を閉じないため、ネットワーク接続がリークします。これを繰り返し実行すると、より多くのIOExceptionが発生する可能性があります。サービスは常にあなたがHTTP経由でサービスを呼び出しているように、サーバー自体ではないことを可能にすることができます...あなたに適切な応答を返さないかもしれませんが

21

問題は、コード

// Get a reader from the url 
BufferedReader reader = new BufferedReader(new 
InputStreamReader(connection.getInputStream())); 

の下でありますまたはサービスが利用できません。ストリームからの応答を読み取る前に、レスポンスコードを確認する必要があります。レスポンスコードは、成功応答の場合はinputStreamから、レスポンスコードの場合はerrorStreamから読み込むかどうかを決定する必要があります。

BufferedReader reader = null; 

if(connection.getResponseCode() == 200) 
{ 
reader = new BufferedReader(new 
InputStreamReader(connection.getInputStream())); 
} 
else 
{ 
reader = new BufferedReader(new 
InputStreamReader(connection.getErrorStream())); 
} 

[外部Webサービスを呼び出し、REST呼び出しでJSONを渡している場合これは、渡された値のデータ型を確認し、問題

+0

優れた答え! –

0

を解決します。

例:た16.0:500 しかし量:文字列とWebサービスコールがサーバーで失敗しましたように、この例で

{ "originalReference":"8535064088443985", 
    "modificationAmount": 
    { "amount":"16.0", 
     "currency":"AUD" 
    }, 
    "reference":"20170928113425183949", 
    "merchantAccount":"MOM1" 
} 

、量の値が送信されたHTTPレスポンスコードを返し送信されました。つまり、Integerが渡された場合、コールが通過しました。このような外部APIを呼び出す際にAPIドキュメントを参照していますが、このような細かい部分は見落とされる可能性があります。

関連する問題