首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpURLConnect - Http使用GSON流不发送内容

HttpURLConnect - Http使用GSON流不发送内容
EN

Stack Overflow用户
提问于 2014-09-29 20:54:21
回答 1查看 2.7K关注 0票数 2

我是Android开发的新手。我正在尝试构建一个Android客户端,它向发送JSON的.NET Web发出请求。

我正在使用:

  • GSON 2.3由于支持流而序列化-反序列化JSON,因为JSONObject不能很好地处理大型JSON (当它试图在内存中的字符串中加载整个JSON时,它使用了太多的内存)。我试着跟踪https://sites.google.com/site/gson/streaming
  • Android中的Android 17
  • HttpURLConnection作为http://developer.android.com/reference/java/net/HttpURLConnection.html推荐的客户端Http

我正在尝试用JSON请求一个http PUT,服务器端的Web获得了http请求,但是它找不到任何JSON,所以我肯定丢失了一些我看不到的东西。我甚至考虑过它在这里说了什么:How to stream a JSON object to a HttpURLConnection POST request关于使用connect()方法,尽管HttpURLConnection文档没有提到它。

我的代码:

代码语言:javascript
复制
public void sendData(final String id, final int count, final MobileData myData)
        throws WebApiException {
    HttpURLConnection urlConnection = null;
    final String urlSend = "http://myIISapi" + "/" + id + "?count=" + count;
    try {
        final URL url = new URL(urlSend);
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setDoOutput(true);
        urlConnection.setChunkedStreamingMode(0); //gets system default chunk size

        urlConnection.setRequestMethod("PUT");
        urlConnection.setRequestProperty("Content-Type", "application/json");
        urlConnection.setRequestProperty("Accept", "application/json");
        urlConnection.connect(); //necessary?


        final OutputStream outputStream = new BufferedOutputStream(urlConnection.getOutputStream());
        final JsonWriter writer = new JsonWriter(new OutputStreamWriter(outputStream, "UTF-8"));
        writer.setIndent("  ");
        Gson gson = new Gson();
        //String parsed = gson.toJson(amsData, MobileAmsData.class);
        gson.toJson(myData, MobileData.class, writer);
        writer.flush();
        writer.close();

        final int statusCode = urlConnection.getResponseCode();
        LOG.info("sendData server responded with status code = " + statusCode);
        if (HttpURLConnection.HTTP_OK != statusCode) {
            throw new WebApiException("Server did not accept data. Status code: " + statusCode);
        }
    }
    catch (Exception e) {
        throw new WebApiException("Unable to send PUT request", e);
    } finally {
        if (urlConnection != null) {
            urlConnection.disconnect();
        }
    }
}

我是不是漏掉了一些强制性的标题?我对发送JSON的流方式有点困惑,所以问题可能在那里。最后,是否有可能通过这样的流数据,实际上有多个HTTP请求,而服务器应该考虑数据正在流?还是流仅在客户端以构建单个http请求的方式发生?

谢谢你们!

编辑:,如果我明确地对JsonWriter说

writer.beginObject();

gson.toJson(myData,MobileData.class,作者);

然后它会抛出一个IllegalStateException嵌套问题。为了澄清这一点,我试图使用混合GSON写作来利用混合流和对象模型访问。因此,我试图获取MobileAmsData复杂对象,将其序列化为JSON,并将其放到远程服务器上。

EDITED2:如果使用

字符串解析= gson.toJson(myData,MobileData.class);

代码语言:javascript
复制
{
   "Things1":[

   ],
   "Things2":[

   ],
   "Things3":[

   ],
   "Things4":[

   ],

   "Things1Count":0,
   "Things2Count":0,
   "Things3Count":0,
   "Things4Count":0,
   "Count":2,
   "BarcodeCount":1
}
EN

回答 1

Stack Overflow用户

发布于 2014-09-30 02:45:28

在这里挣扎了很多之后,我发现:

  • 如果想要充分利用Android设备的低内存使用率,就必须使用分组传输编码。因此,HttpURLConnection应该设置块流模式(0表示系统的默认或任何其他字节数,如所需的1000个字节)。

urlConnection.setChunkedStreamingMode(0);

  • 当使用ChunkedStreamingMode时,Http请求将使用传输编码HTTP头,但内容长度将为0。--这似乎是在服务器端造成问题的原因,因为如果请求没有内容长度,则ASP.NET Web方法无法反序列化JSON。
  • 如果我想充分利用GSON流模式,我需要添加一些智能功能,逐行写入JsonWriter (输出流),而不是同时写入整个对象。如果我打开这个流,然后立即解析Json,然后关闭这个流,我想内存使用量会比我转换到Json并逐行写的时候要高。(在GSON文档中,这一点对我来说不是很清楚)

总之,上面的代码可以使用GSON将JSON流发送到输出流并使用块编码传输发送HTTP请求.但是如果内存使用是个问题的话,那么它的代码效率就不高,应该重新工作来逐行序列化。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26108722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档