发送回JSON的Servlet:接收时的混乱

时间:2012-01-13 08:52:22

标签: java json servlets

我有一个发送回JSON对象的Servlet,我想在另一个Java项目中使用这个servlet。我有这种方法可以得到结果:

public JSONArray getSQL(String aServletURL)
{
 JSONArray toReturn = null;
 String returnString = "";
 try
 {
    URL myUrl = new URL(aServletURL);
        URLConnection conn = myUrl.openConnection();
        conn.setDoOutput(true);
        BufferedReader in = new BufferedReader( new InputStreamReader( conn.getInputStream() ) );
        String s;
        while ((s = in.readLine()) != null )
         returnString += s;
        in.close();

        toReturn = new JSONArray(returnString);
 }
 catch(Exception e)
 {
    return new JSONArray();
 }
        return toReturn;
}

这很有效,但我面临的问题如下: 当我同时执行多个请求时,结果会混淆,我有时会收到与我发送的请求不匹配的响应。

我怀疑问题与我收到回复的方式有关:Reader从连接的InputStream读取字符串。

如何确保获得一个请求 - >一个相应的回复? 有没有更好的方法从我的servlet中检索我的JSON对象?

干杯, 添

2 个答案:

答案 0 :(得分:1)

  

当我同时执行多个请求时,结果会混淆,我有时会收到与我发送的请求不匹配的响应。

您的servlet不是线程安全的。我敢打赌,你不正确地将请求范围数据直接或间接地分配为servlet的实例或类变量。这是一个常见的初学者的错误。

仔细阅读此How do servlets work? Instantiation, sessions, shared variables and multithreading并相应地修复您的servlet代码。问题不在目前为止显示的URLConnection代码中,尽管它表明您在 {/ 1>} doGet()doPost()中完成相同的工作,反过来已经是如何设计servlet的气味。

答案 1 :(得分:0)

尝试删除setDoOutput(true),您只使用连接进行输入,因此不应使用它。

编辑:或者尝试使用HttpClient,使用“原始”Java更好。