2014-01-05 2 views
0

Я борюсь с некоторым кодом Java, который отлично работает при правильном выполнении на моем локальном хосте, но с ошибкой HTTP 406 при выполнении через мой веб-сервер не работает. Я попытался прочитать 406 кодов ошибок, но, я зациклился на том, что код работает нормально локально. Цель кода - отправить запрос на веб-сервер через HTTP для выполнения PHP-программы на задней панели. В запросе HTTP нет параметров. Программа PHP извлекает некоторые данные из базы данных SQL и возвращает ее в программу Java через JSON. Все это прекрасно работает при локальном запуске (например, через «localhost»). Вот последняя колдовство кода ...Java для PHP - возвращает JSON, но получает ответ HTTP 406

// preparation 
String charset = "UTF-8"; 
String szURL = new String(); 
int responseCode = 0; 

if (!debugConfiguration) 
    szURL = "https://secure.justhost.com/xxxx.php"; // removed actual file name 
else 
    szURL = "http://localhost/xxxx.php";    // removed actual file name 
// HTTP Post request 
URL object = null; 
try 
    { 
    object = new URL(szURL); 
    } 
catch (MalformedURLException e) 
    { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

//xxxHttpsURLConnection con = null; 
HttpURLConnection con = null; 
try 
    { 
    //xxxcon = (HttpsURLConnection) object.openConnection(); 
    con = (HttpURLConnection) object.openConnection(); 
    } 
catch (IOException e) 
    { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

//add request header 
try 
    { 
    //xxxcon.setRequestMethod("POST"); 
    con.setRequestMethod("GET"); 
    } 
catch (ProtocolException e) 
    { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

//con.setRequestProperty("Accept-Charset", charset); 
//con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset); 
//con.setRequestProperty("User-Agent", USER_AGENT); 
//con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); 
con.setRequestProperty("User-Agent", USER_AGENT); 
con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); 
con.setRequestProperty("Content-Type", "application/json"); 
con.setRequestProperty("Accept", "application/json"); 

// Send post request 
con.setDoOutput(true); 

DataOutputStream wr = null; 
try 
    { 
    wr = new DataOutputStream (con.getOutputStream()); 
    } 
catch (IOException e) 
    { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
try 
    { 
    wr.close(); 
    } 
catch (IOException e) 
    { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

try 
    { 
    responseCode = con.getResponseCode(); 
    } 
catch (IOException e) 
    { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

BufferedReader in = null; 
try 
    { 
    in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
    } 
catch (IOException e) 
    { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

String inputLine; 
StringBuffer response = new StringBuffer(); 

try 
    { 
    while ((inputLine = in.readLine()) != null) 
     { 
     response.append(inputLine); 
     } 
    } 
catch (IOException e) 
    { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

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

Gson gson = new Gson();  
jsonArticleCategories[] enums = gson.fromJson(response.toString(), jsonArticleCategories[].class); 
for (int i=0; i<enums.length; ++i) 
    { 
    jsonArticleCategories jac = enums[i]; 
    cats.add(jac.get_category()); 
    } 

Как видно из кода, я попытался несколько вариаций параметров и т.д. Я, вероятно, отсутствует что-то очень простой, но я просто не видя этого. Возможно, я слишком долго смотрел на код. Я был бы очень признателен, если бы кто-то мог указать на мои недостатки. Заранее спасибо.

+1

Вы уверены, что живой сервер отправляет обратно тип контента 'application/json', а также действительный JSON? –

+0

406 указывает, что сервер считает запрос неприемлемым по какой-либо причине. Было бы интересно посмотреть, что на самом деле надвигается на провод. Btw: запрос 'GET' с заголовком' Content-Type' немного странный ... Возможно, вы не должны безоговорочно устанавливать этот заголовок? – DaSourcerer

+0

@ExplosionPills - Ну, я не уверен. Я забыл упомянуть, что когда я запускаю PHP-код на сервере, набрав тот же URL-адрес, что и в java-коде, он работает правильно. Я вижу запрашиваемые поля json, возвращенные на веб-странице. – rrirower

ответ

0

Для всех с аналогичной проблемой. Я смог решить эту проблему с помощью предложения Тима Б использовать тестовую проводку Rest, чтобы вникать в аспекты HTTP моей проблемы. Это дало мне некоторое представление о том, что происходит. Затем я наткнулся на this StackOveflow post, который пролил еще немного света на свойства, которые я должен отправлять через мой код апплета. Теперь у меня есть код апплета, вызывающий PHP-код и возвращающий json-данные. Спасибо всем, кто предложил помощь.

0

NotAcceptable означает, что запрос пришел в формате (например, JSON), который сервер не смог обработать. Довольно многие из фреймворков Java автоматически собирают и обрабатывают типы сообщений, глядя, есть ли библиотека для их обработки, возможно, PHP делает что-то подобное?

Используйте тестовую проводку для отдыха, и вы можете попробовать отправить запрос самостоятельно и сосредоточиться на том, чтобы серверная сторона работала с этим, а затем только после этого добавьте усложнение кода на стороне клиента.

Если вы используете firefox https://addons.mozilla.org/en-US/firefox/addon/restclient/reviews/, это хорошо. Я уверен, что в другом браузере есть что-то подобное, но я не использовал их сам.

+0

«Может быть, PHP делает что-то подобное?» Я могу смело сказать «нет». Я бы предпочел, чтобы веб-сервер был неправдоподобным. – DaSourcerer

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