2014-01-05 30 views
0

我正在努力使用一些Java代码,该代码在我的本地主机上正确执行时工作正常,但在通过我的Web服务器执行时发生的HTTP响应406失败。我试图读取406错误代码,但是,我坚持代码在本地正常工作的事实。代码的目的是通过HTTP向Web服务器发送请求以执行后端PHP程序。 HTTP请求不需要参数。 PHP程序从SQL数据库中检索一些数据,并通过JSON将其返回给Java程序。在本地运行时,这一切都可以正常工作(例如通过“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表示服务器无论出于何种原因都发现请求不可接受。看到实际上被推到电线上会很有趣。顺便说一句:带有一个“Content-Type”头的GET请求有点奇怪......也许你不应该无条件设置这个头部? – DaSourcerer

+0

@ExplosionPills - 呃,我不确定。我忘了提及,当我通过输入java代码中的相同url来运行服务器上的PHP代码时,它确实可以正常工作。我看到了网页上返回的请求的json字段。 – rrirower

回答

0

对于所有那些有类似问题。在Tim B的建议下,我能够解决这个问题,使用Rest测试工具深入了解我的问题的HTTP方面。这让我对发生的事情有了一些了解。然后,我偶然发现了this StackOveflow post,这些特性为我应该通过applet代码发送的属性揭示了更多的光芒。我现在有applet代码调用php代码并返回json数据。感谢所有提供的帮助。

0

不可接受意味着请求采用服务器无法处理的格式(例如JSON)。很多Java框架通过查看是否有可用的库来处理它们,自动获取并处理消息类型,也许PHP正在做类似的事情?

使用休息测试工具,您可以尝试自己发送请求并专注于让服务器端工作,然后才添加客户端代码的复杂性。

如果使用firefox https://addons.mozilla.org/en-US/firefox/addon/restclient/reviews/还是不错的。我确定其他浏览器有类似的东西,但我没有用过它们。

+0

“也许PHP正在做类似的事情?”我可以放心地说不。我宁愿认为网络服务器行为不端。 – DaSourcerer