Jquery ajax версия работает, HttpUrlConnection POST не работает - код ответа 500 - PullRequest
2 голосов
/ 23 февраля 2012

Я какое-то время занимался проблемой и был бы очень признателен, если бы кто-нибудь дал мне несколько советов.

Мне нужно выполнить ajax-вызов страницы aspx на другом сервере.В IE8 это не работает из-за междоменных проблем.Некоторые люди предложили, чтобы я попробовал тип данных jquery "jsonp", и это позволит разрешить междоменную связь в IE8, но это не удалось.

Итак, чтобы решить эту проблему, в моем коде есть процедура обнаружения браузера, которая проверяет, является ли это IE8.Если это IE8, то я делаю, что я делаю ajax-вызов на промежуточной странице JSP.

То, что должна делать промежуточная страница jsp, - это взять эти параметры и в основном опубликовать их на странице aspx.

В связи с этим используется код, который я использую:

<%

// get the parameters
String fileName = request.getParameter("fileName");
String param02 = request.getParameter("param02");
String param03 = request.getParameter("param03");
String param05 = request.getParameter("param05");
String param08 = request.getParameter("param08");
String param11 = request.getParameter("param11");


java.net.URL url;
java.net.HttpURLConnection connection = null;  
try {

    String urlParameters = "fileName="+ fileName+"&param02="+ param02+"&param03="+ param03+"&param05="+ param05+"&param08="+ param08+"&param11="+ param11;
    String encodedurl = java.net.URLEncoder.encode(urlParameters); 

    out.println(encodedurl);
    //Create connection
    url = new java.net.URL(
            "https://somepage.aspx");
    connection = (java.net.HttpURLConnection) url
            .openConnection();
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    ////connection.setRequestProperty("Content-Type","text/xml; charset=utf-8");

    connection.setRequestProperty("Content-Length", "" + 
            Integer.toString(encodedurl.getBytes().length));
    connection.setRequestProperty("Content-Language", "en-US");  

    connection.setUseCaches (false);
    connection.setDoInput(true);
    connection.setDoOutput(true);

    //Send request
    DataOutputStream wr = new DataOutputStream (
            connection.getOutputStream ());
    wr.writeBytes (encodedurl);
    wr.flush ();
    wr.close ();
out.println(connection.getResponseCode());

    //Get Response

      InputStream is = connection.getInputStream();
      BufferedReader rd = new BufferedReader(new InputStreamReader(is));
      String line;
      StringBuffer responseBuffer = new StringBuffer(); 
      while((line = rd.readLine()) != null) {
        responseBuffer.append(line);
        responseBuffer.append('\r');
      }
      rd.close();
      out.println("\n\nRESPONSE\n\n" +responseBuffer.toString());
      out.println(connection.getErrorStream());



} catch (Exception e) {

    e.printStackTrace();
    out.println("Exception :(+ " +e);


} finally {

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

    %>

Код приводит к следующей ошибке:

java.io.IOException: Server returned HTTP response code: 500 

В Chrome обычный вызов ajaxвыполняется, и это работает - ничего похожего на этот код ошибки.

Может кто-нибудь, пожалуйста, помогите.

1 Ответ

1 голос
/ 23 февраля 2012

Сбой сервера. connection.getErrorStream() может содержать подробный отчет об ошибке. Вам нужно прочитать его в блоке catch.

Что касается вашего кода, то, по крайней мере, способ, которым ваш URL закодировал строку запроса, неверен.

String urlParameters = "fileName="+ fileName+"&param02="+ param02+"&param03="+ param03+"&param05="+ param05+"&param08="+ param08+"&param11="+ param11;
String encodedurl = java.net.URLEncoder.encode(urlParameters); 

Вы вообще не должны кодировать символы-разделители & и = в URL. Исправьте это следующим образом:

String charset = "UTF-8";
String urlParameters = String.format(
    "fileName=%s&param02=%s&param03=%s&param05=%s&param08=%s&param11=%s", 
        URLEncoder.encode(fileName, charset), 
        URLEncoder.encode(param02, charset), 
        URLEncoder.encode(param03, charset), 
        URLEncoder.encode(param05, charset), 
        URLEncoder.encode(param08, charset),
        URLEncoder.encode(param11, charset));

Вы также должны быть чрезвычайно осторожны с использованием кодировки. Вы все время полагаетесь на кодировку платформы по умолчанию, а не указываете ее явно. Сервер не обязательно может использовать ту же самую кодировку платформы по умолчанию. Длина содержимого, например, может варьироваться в зависимости от используемой кодировки.

Вы также не должны использовать DataOutputStream для написания тела запроса. Он предназначен для создания так называемых .dat файлов, в которых блоки данных отформатированы и разделены особым образом на двоичном уровне. Просто напишите это прямо в connection.getOutputStream().

connection.getOutputStream().write(urlParameters.getBytes(charset));

То, что на сервере произошел сбой вместо возврата какого-либо HTTP 4nn Ошибка в свою очередь также указывает на программную ошибку в коде сервера. Если у вас есть контроль над этим, исправьте это. Если нет, сообщите об этом ответственному администратору сервера.

Смотри также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...