8

HTTPUrlConnectionを使用してURLを取得しようとしていますが、常に500コードを取得していますが、ブラウザーまたはcurlを使用して同じURLにアクセスしようとすると、正常に機能します。

これはコードです

try{
    URL url = new URL("theurl"); 
    HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();
    httpcon.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    httpcon.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:14.0) Gecko/20100101 Firefox/14.0.1");
    System.out.println(httpcon.getHeaderFields());
    }catch (Exception e) {
        System.out.println("exception "+e);
    }

ヘッダーフィールドを印刷すると、500コードが表示されます。URLをgoogle.comなどに変更すると、正常に機能します。しかし、なぜここで機能しないのかわかりませんが、ブラウザとcurlでは正常に機能します。

どんな助けでも大歓迎です。

ありがとうございました、

4

8 に答える 8

8

ステータス コード 500 は、Web サーバーのコードがクラッシュしたことを示しています。HttpURLConnection #getErrorStream()を使用して、エラーの詳細を把握してください。HTTP ステータス コード 500を参照

于 2012-07-30T12:45:52.167 に答える
8

これは主にエンコーディングが原因で発生しています。ブラウザを正常に使用しているのに、プログラムで 500 (内部サーバー エラー) が発生する場合は、ブラウザに文字セットとコンテンツ タイプに関する非常に洗練されたコードがあるためです。

これが私のコードで、文字セットと英語として ISO8859_1 の場合に機能します。

public void sendPost(String Url, String params) throws Exception {


    String url=Url;
    URL obj = new URL(url);
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

    con.setRequestProperty("Acceptcharset", "en-us");
    con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
    con.setRequestProperty("charset", "EN-US");
    con.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    String urlParameters=params;
    // Send post request
    con.setDoOutput(true);
    con.setDoInput(true);
    con.connect();
    //con.

    DataOutputStream wr = new DataOutputStream(con.getOutputStream());
    wr.writeBytes(urlParameters);
    wr.flush();
    wr.close();

    int responseCode = con.getResponseCode();
    System.out.println("\nSending 'POST' request to URL : " + url);
    System.out.println("Post parameters : " + urlParameters);
    System.out.println("Response Code : " + responseCode);

    BufferedReader in = new BufferedReader(
            new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
    }
    in.close();

    //print result
    System.out.println(response.toString());
    this.response=response.toString();
    con.disconnect();

}

メインプログラムでは、次のように呼び出します。

myclassname.sendPost("https://change.this2webaddress.desphilboy.com/websitealias/orwebpath/someaction","paramname="+URLEncoder.encode(urlparam,"ISO8859_1"))
于 2014-06-05T00:00:19.240 に答える
1

接続で次のリダイレクトが許可されていることを確認してください。これが、接続とブラウザーの動作の違いの考えられる理由の 1 つです (デフォルトでリダイレクトを許可します)。

コード 3xx を返す必要がありますが、接続のためにそれを 500 に変更する何かがどこかにある可能性があります。

于 2012-07-30T12:57:40.817 に答える
0

私の場合、サーバーはアクセスしたいページに対して常に HTTP/1.1 500 (Java のようにブラウザーで) を返しますが、それでも Web ページのコンテンツを正常に配信することが判明しました。

ブラウザーを介して特定のページにアクセスする人間は、ページが表示され、エラーメッセージが表示されないため、気付かないだけです。Java では、入力ストリームの代わりにエラーストリームを読み取る必要がありました (@Muse に感謝)。

理由はわかりませんが。クローラーを締め出すためのあいまいな方法かもしれません。

于 2016-06-22T14:29:10.093 に答える
0

パラメータを確認してください

httpURLConnection.setDoOutput(false);

GETメソッドの場合のみtrueonPOSTに設定すると、多くの時間を節約できます!!!

于 2021-12-21T04:54:30.210 に答える