将JSON发送到服务器并接收响应

问题描述 投票:0回答:1

我有一个名为FindMeARestaurantDAO的类,其中包含一些方法,这些方法将通过Activity中具有AsyncTask个内部类的服务器进行网络调用。我的POST request Method出现问题,如下所示:

@Override
    public String findMeARestaurant(List<CheckboxDTO> filters) {
        String inputLine;
        String errors;
        String result;
        try
        {
            // For each CheckboxDTO, get the Id and add it to JSONArray
            JSONArray checkboxJSONArray = new JSONArray();
            for (CheckboxDTO checkbox : filters)
            {
                try
                {
                    // Create JSONObject
                    JSONObject object = new JSONObject();
                    // Build the object
                    object.put("id", checkbox.getId());
                    // Add object to JSONArray
                    checkboxJSONArray.put(object);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }

            }

            // Put JSONArray into wrapping JSONObject
            JSONObject serverObject = new JSONObject();
            try
            {
                // Create wrapping JSONObject
                serverObject.put("filtersIds", checkboxJSONArray);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }

            // Create URL object to hold URL
            URL findMeARestaurantURL = new URL(findMeARestaurantsURL);
            // Create connection to server
            HttpURLConnection connection = (HttpURLConnection) findMeARestaurantURL.openConnection();

            // Set request method and timeouts
            connection.setRequestMethod(FIND_RESTAURANT_REQUEST_METHOD);
            connection.setRequestProperty("Content-Type", "application/json; utf-8");
            connection.setRequestProperty("Accept", "application/json");
            connection.setChunkedStreamingMode(0);
            connection.setDoOutput(true);
            connection.setReadTimeout(READ_TIMEOUT);
            connection.setConnectTimeout(CONNECTION_TIMEOUT);

            // Connect to server
            connection.connect();

            // Create Writer
            Writer writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
            writer.write(String.valueOf(serverObject));

            // Close Writer
            writer.close();


            // Create InputStreamReader to read response from server
            InputStreamReader streamReader = new InputStreamReader(connection.getInputStream(), "utf-8");

            // Create BufferedReader to read through InputStream
            BufferedReader reader = new BufferedReader(streamReader);
            // Create StringBuilder to hold our result
            StringBuilder stringBuilder = new StringBuilder();

            // Check if the line read is null
            while ((inputLine = reader.readLine()) != null){
                stringBuilder.append(inputLine);
            }

            // Close out InputStream and BufferedReader
            reader.close();
            streamReader.close();

            // Set result to stringBuilder
            result = stringBuilder.toString();
            connection.disconnect();
        }
        catch (IOException e)
        {
            e.printStackTrace();
            return null;
        }

        return result;
    }

该方法为POST,当我运行我的应用程序时,它似乎将JSON serverObject发送到服务器,但在InputStreamReader上失败,并返回FileNotFoundException。该服务器是由合作伙伴为此项目设置的,并表示该API的这一部分应该可以正常工作。我是否缺少POST请求的内容?我需要做一些不同的事情来读取服务器的响应吗?任何帮助将不胜感激。

java android json post httpurlconnection
1个回答
0
投票

此问题的解决方案是我如何通过POST请求将数据发送到服务器。建立连接之前,我必须通过将过滤器的ID添加到我的URL来将其发送到服务器。我修改后的方法遍历每个CheckboxDTO并捕获ID,然后将其添加到数组中,然后将其添加到URL:

@Override
    public String findMeARestaurant(List<CheckboxDTO> filters) {
        String inputLine;
        String result;
        try
        {

            // For each CheckboxDTO, get the Id and add it to String Array
            int checkboxArray[] = new int[filters.size()];
            int i = 0;
            for (CheckboxDTO checkbox : filters)
            {
                try
                {
                    int id = checkbox.getId();
                    checkboxArray[i] = id;
                    i++;
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }

            }

            // Add filters to end of URL for POST Request
            findMeARestaurantsURL += "?filterIds=";
            for (i = 0; i < checkboxArray.length; i++)
            {
                if (i+1 != checkboxArray.length)
                {
                    findMeARestaurantsURL += checkboxArray[i] + ",";
                }
                else
                {
                    findMeARestaurantsURL += checkboxArray[i];
                }
            }
            // Create URL object to hold URL
            URL findMeARestaurantURL = new URL(findMeARestaurantsURL);
            // Create connection to server
            HttpURLConnection connection = (HttpURLConnection) findMeARestaurantURL.openConnection();

            // Set request method and timeouts
            connection.setRequestMethod(FIND_RESTAURANT_REQUEST_METHOD);
            connection.setRequestProperty("Content-Type", "application/json; utf-8");
            connection.setRequestProperty("Accept", "application/json");
            connection.setChunkedStreamingMode(0);
            connection.setDoOutput(true);
            connection.setReadTimeout(READ_TIMEOUT);
            connection.setConnectTimeout(CONNECTION_TIMEOUT);

            // Connect to server
            connection.connect();

            // Create InputStreamReader to read response from server
            InputStreamReader streamReader = new InputStreamReader(connection.getInputStream(), "utf-8");

            // Create BufferedReader to read through InputStream
            BufferedReader reader = new BufferedReader(streamReader);
            // Create StringBuilder to hold our result
            StringBuilder stringBuilder = new StringBuilder();

            // Check if the line read is null
            while ((inputLine = reader.readLine()) != null){
                stringBuilder.append(inputLine);
            }

            // Close out InputStream and BufferedReader
            reader.close();
            streamReader.close();

            // Set result to stringBuilder
            result = stringBuilder.toString();
            connection.disconnect();
        }
        catch (IOException e)
        {
            e.printStackTrace();
            return null;
        }

        return result;
    }

该服务器使用Spring框架,并且据我的合伙人说,没有使用JSONObject

© www.soinside.com 2019 - 2024. All rights reserved.