1

URL からログインしようとしていますが、httpurlconnevtion でステータス コード 500 を取得しています。

public static String excutePost(String targetURL, String urlParameters)
  {
    URL url;
    HttpURLConnection connection = null;  
    try {
      //Create connection
      url = new URL(targetURL);
      connection = (HttpURLConnection)url.openConnection();
      connection.setRequestMethod("POST");
      connection.setRequestProperty("Content-Type", 
           "application/x-www-form-urlencoded");
      connection.setRequestProperty("Connection", "Keep-Alive");    
      connection.setRequestProperty("Content-Length", "" + 
               Integer.toString(urlParameters.getBytes().length));
      connection.setRequestProperty("Content-Language", "en-US");  
      connection.setRequestProperty("Accept-Encoding", ""); 
      connection.setUseCaches (false);
      connection.setDoInput(true);
      connection.setDoOutput(true);

      //Send request
      DataOutputStream wr = new DataOutputStream (
                  connection.getOutputStream ());
      wr.writeBytes (urlParameters);
      wr.flush ();
      wr.close ();

      System.out.println("status :"+connection.getResponseCode());
      System.out.println("getErrorStream() :"+connection.getErrorStream());
      //Get Response    
      InputStream is = connection.getInputStream();
      BufferedReader rd = new BufferedReader(new InputStreamReader(is));
      String line;
      StringBuffer response = new StringBuffer(); 
      while((line = rd.readLine()) != null) {
        response.append(line);
        response.append('\r');
      }
      rd.close();
      return response.toString();

    } catch (Exception e) {

      e.printStackTrace();
      return null;

    } finally {

      if(connection != null) {
        connection.disconnect(); 
      }
    }
  }

そして私のパラメータは

String urlParameters =
                        "pwd1=" + URLEncoder.encode("DEMO123", "UTF-8") +
                        "&badge=" + URLEncoder.encode("1233", "UTF-8");

私はlogcatを取得しています

status :500
getErrorStream() :libcore.net.http.FixedLengthInputStream@417bc5c0

ありがとうございました

**EDITED 2**

私も試してみました

DataOutputStream dos = new DataOutputStream(connection.getOutputStream());

        // Add badge
        dos.writeBytes(LINE_START + BOUNDRY + LINE_END);
        dos.writeBytes("Content-Disposition: form-data; name='badge';");
        dos.writeBytes(LINE_END + LINE_END);
        dos.writeBytes("1233");
        dos.writeBytes(LINE_END);

        // Add password
        dos.writeBytes(LINE_START + BOUNDRY + LINE_END);
        dos.writeBytes("Content-Disposition: form-data; name='pwd1';");
        dos.writeBytes(LINE_END + LINE_END);
        dos.writeBytes("DEMO123");
        dos.writeBytes(LINE_END);
4

2 に答える 2

1

500を示しますInternal Server Error。あなたの側にはおそらくエラーはなく、サーバー上にあります。何かを間違って送信し、それが原因でサーバーが 500 を返す場合でも、それはサーバーの問題です。

編集:わかりまし た、サーバーは400 Bad Request代わりに次のようなものを返す必要500 Internal Server Errorがありますが、今あなたのエラーを見つけました:

connection.setRequestProperty("Content-Length", Integer.toString(urlParameters.getBytes().length));

...

//Send request
DataOutputStream wr = new DataOutputStream (connection.getOutputStream ());
wr.writeBytes (urlParameters);

ここでの問題は、最初にwhich をurlParameters使用してバイトを取得することgetBytesです (javadoc を引用):

プラットフォームのデフォルトの文字セットを使用して、この文字列を一連のバイトにエンコードします

そして、DataOutputStream.writeByteswhich を使用してバイトを書き込みます(javadocを引用):

文字列内の各文字は、上位 8 ビットを破棄することによって順番に書き出されます。

要約するContent-Lengthと、データと一致しません。したがって、サーバーはあなたに

java.io.IOException: コンテンツの長さの制限である 20 バイトを超えました

解決:

//consider urlParameters.getBytes("UTF-8") method instead of using default encoding
byte[] bodyData = urlParameters.getBytes(); 
connection.setRequestProperty("Content-Length", Integer.toString(bodyData.length));

...

//Send request
InputStream out = connection.getOutputStream();
out.write(bodyData);

編集 2: 編集 1 は間違いなく有効ですが、問題をもう一度見てみると、間違いなくサーバーが原因であると思います。サーバーが不正なヘッダーを返していると思いますContent-Length.Androidでデータが読み取られると、システムはサーバーから本来あるべきよりも多くのデータが来ていることを認識しContent-Length、例外をスローし、ステータスコードを500に置き換えます。本当にサーバーエラーです。

編集3:

connection.setRequestProperty("Content-Language", "en-US");  
connection.setRequestProperty("Accept-Encoding", ""); 

Content-Languageここで必要のない設定の代わりに、に設定Content-EncodingUTF-8、空の代わりにAccept-Encoding、実際に期待される MIME タイプを追加する必要があります。これはサーバー エラーだと思いますが、リクエスト ヘッダーを正しく設定すると表示されない可能性があります。

于 2013-03-12T10:46:06.237 に答える
0

ステータスコード500は を意味しInternal Server Errorます。なぜこれがスローされるのかは、背後のサーバーだけがtargetURL知っています。

API を正しく使用していることを確認します。応答の本文 (ステータス コード以外) を見ると、ヒントが得られる場合があります。

于 2013-03-12T10:44:39.900 に答える