2013-03-12 1 views
1

Я пытаюсь войти через URL и я получаю код состояния 500 в httpurlconnevtionпроблемы в HttpURLConnection получение статус 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(); 
     } 
    } 
    } 

и мой PARAMS является

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

я получаю LogCat

status :500 
getErrorStream() :[email protected] 

спасибо

**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); 

ответ

0

код состояния 500 означает Internal Server Error. Почему это брошено на вас, знает только сервер за targetURL.

Проверьте правильность использования API. Взгляд на тело ответа (помимо кода состояния) может дать подсказку.

+0

как проверить кузов? – Android

+0

@ Андроид проверить connection.getErrorStream(); –

1

500 обозначает Internal Server Error. Вероятно, на вашей стороне нет ошибок, это на сервере. Даже если вы отправляете что-то неправильно, и это заставляет сервер возвращать 500, это все еще проблема с сервером.

Edit: Окей, сервер должен скорее вернуть что-то вроде 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); 

Проблема здесь состоит в том, что ваш первый ПОЛУЧИТЕ байты из urlParameters с помощью getBytes который (цитирую Javadoc):

Зашифровывает эту строку в последовательность байтов, используя кодировку по умолчанию платформы в

А потом писать байты с помощью DataOutputStream.writeBytes, который (цитирую JavaDoc):

Каждый символ в строке записывается в последовательности, отбрасывая ее высокие восемь битов.

Таким образом, ваш 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); 

Edit 2: Редактировать 1 определенно действительно, однако, снова рассматривая проблему, я считаю, что ошибка определенно вызвана сервером.Я думаю, что сервер возвращает плохой заголовок Content-Length, и, когда данные считываются на Android, система понимает, что с сервера поступает больше данных, чем должно быть Content-Length, и генерирует исключение, также заменяя код состояния на 500 потому что это действительно ошибка сервера.

Edit 3:

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

Вместо установки Content-Language, который не является здесь необходимым, вы должны установить Content-Encoding в UTF-8 и вместо пустого Accept-Encoding, вы должны добавить реальный ожидаются MIME-типа. Я считаю, что это ошибка сервера, но, возможно, она не появится, если вы правильно настроили заголовки запросов.

+0

спасибо, java.io.IOException: превышено ограничение длины контента в 20 байт, есть ли проблема – Android

+0

@test Да, это проблема с сервером. Покажите нам код сервера. – Sulthan

+0

он отлично работает с ios, и я добавил код сервера в свой вопрос plz check – Android

Смежные вопросы