HttpURLConnection Post:输出流没有效果?

2023-12-01

我正在开发一个 Android 应用程序,并且已经发现不同的 Android 版本在处理 Http(s)URLConnections 方面有不同的方式 (http://stackoverflow.com/q/9556316/151682)。

我遇到了这样的问题:Android 4 很好地通过 HTTPS 执行 POST 请求,在运行下面的代码时自动添加 Content-Type 等标头。

然而,在 Android 2.3.5(设备和模拟器)上,对输出流的任何写入似乎都会被忽略 - 我使用 Web 代理 Charles 对其进行了调试,并且在发送所有标头时,写入输出流的数据不会一起发送...

有人知道如何解决这个问题吗?

注意:由于我正在开发的 API 只有自签名证书,因此我此时需要禁用证书验证。

蒂亚,帕特里克

Update同时,我也尝试过以下操作,但无济于事:

  • Calling close()之后flush()调用 BufferedOutputStream
  • Calling close()在 OutputStream 和 BufferedOutputStream 上
  • 使用 OutputStreamWriter 代替
  • 不打电话close()打电话之前getInputStream()

    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setConnectTimeout(CONNECT_TIMEOUT);
    
    connection.setDoOutput(true); // Triggers POST.
    connection.setRequestMethod("POST");
    int contentLength = 0;
    if(body != null) {
        contentLength = body.getBytes().length;
    }
    
    // Workarounds for older Android versions who do not do that automatically (2.3.5 for example)
    connection.setRequestProperty(HTTP.TARGET_HOST, url.getHost());
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    
    // Set SSL Context -- Development only
    if(context != null && connection instanceof HttpsURLConnection){
        HttpsURLConnection conn = (HttpsURLConnection)connection;
        conn.setSSLSocketFactory(context.getSocketFactory());
        conn.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });
    }
    
    try{
        // Add headers
        if(headers != null){
            for (NameValuePair nvp : headers) {
                if(nvp != null){
                    connection.setRequestProperty(nvp.getName(), nvp.getValue());
                }
            }
        }
    
        connection.setFixedLengthStreamingMode(contentLength);
        OutputStream outputStream = null;
        try {
            if(body != null){
                outputStream = connection.getOutputStream();
                BufferedOutputStream stream = new BufferedOutputStream(outputStream);
                stream.write(body.getBytes()); // <<<< No effect ?!
                stream.flush();
    
            }
        } finally {
            if (outputStream != null) 
                try { 
                    outputStream.close(); 
                }
            catch (IOException logOrIgnore) {
                // ...
            }
        }
    
        InputStream inputStream = connection.getInputStream();
    
        // .... Normal case ....
    
    }
    catch(IOException e){
        // ... Exception! Check Error stream and the response code ...
    
    
    }
    finally{
        connection.disconnect();
    }
    

    }


对我来说,你打电话的顺序似乎是DoSetOutput等等是奇怪行为的原因......

一些带有 Android 上 HTTP POST 工作代码的链接/源代码:

  • Android 上的 HttpURLConnection 失败(参见问题中的班级作为参考)
  • HttpURL连接(参考包括示例代码)
  • 很好的示例,包括异常处理
  • http://digitallibraryworld.com/?p=189
  • 如何使用 DefaultHttpClient 写入 OutputStream?
  • DefaultHttpClient GET 和 POST 命令 Java Android(参见相关代码)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HttpURLConnection Post:输出流没有效果? 的相关文章

随机推荐

  • 非英语语言的推送通知

    我已经成功实现了这段代码 有谁知道如何用 C 编写 Apple 推送通知提供程序 效果很好 但我有一个问题 有人可以帮助我如何发送希伯来语或阿拉伯语等非英语消息吗 如果字符串包含任何非英文字符 则不会发送 谢谢 我找到了解决方案 长度错了
  • 在 Python 中使用 urlopen() 防止“隐藏”重定向

    我在用美丽汤对于网页抓取 我在使用时遇到特定类型网站的问题urlopen 网站上的每个项目都有自己独特的页面 并且项目有不同的格式 例如 500 毫升 1 升 2 升 当我打开产品的 URL 时 www example com produc
  • 无法使用 fetchkml 函数将本地 KMZ 文件加载到具有 google Earth 插件的浏览器中

    我们有一个 KMZ 文件 可以很好地加载到 Google 地球桌面应用程序中 没有错误 当我们尝试使用 Google Earth 插件来做同样的事情时 它甚至不会从fetchKml功能 我们需要了解使用的任何特殊设置fetchKml在本地文
  • 如何使用 Qt 创建暂停/等待函数?

    我正在玩Qt 我想在两个命令之间创建一个简单的暂停 但它似乎不会让我使用Sleep int mili 而且我找不到任何明显的等待函数 我基本上只是制作一个控制台应用程序来测试一些类代码 这些代码稍后将包含在适当的 Qt GUI 中 所以现在
  • 编译器为内在函数生成的程序集的问题

    我正在使用英特尔 SSE AVX FMA 内在函数来实现某些数学函数的完美内联 SSE AVX 指令 给出以下代码 include
  • 在 BLE 中随机化 Mac 地址

    我制作了一款将 iOS 设备变成信标的应用程序 现在 当我从 Android 设备扫描 BLE 设备时 我在扫描列表中找到了该 iOS 设备 但问题是每次我都得到随机的 Mac 地址 所以 我的问题是 这种默认行为是否意味着获取随机 mac
  • pine 脚本中 := 和 = 运算符之间的区别

    我对 TradingView Pine 脚本非常陌生 我没有找到合适的参考来理解两者之间的区别 and 运营商 有人有参考或描述吗 提前致谢 用于声明和初始化变量 用于在初始化后为变量赋值 将其转换为 可变变量 任何不可变变量 follow
  • 如何在 iPhone 中裁剪图像

    我想做同样的事情this问题 在我的应用程序中 我想像在 Facebook 中进行图像裁剪一样裁剪图像 任何人都可以通过优秀教程的链接或任何示例代码来指导我 我提供的链接将完整描述我的要求 您可以创建具有任何属性的新图像 这是我的功能 女巫
  • 顺序索引的填充因子为 PK

    Yes fillfactor再次 我花了很多时间阅读 但无法决定哪种方案最适合每种情况 我不明白碎片何时以及如何发生 我正在将数据库从 MS SQL Server 迁移到 PostgreSQL 9 2 Case 1 在顺序 串行 PK 中每
  • Android 应用程序中的 JPEG 硬件解码支持

    我的 Android 应用程序需要在 Android 2 2 手机 及更高版本 上解码基于大分辨率的 JPEG 图像 目前我正在使用 BitmapFactory decodeStream API 即 SKIA 库来解码流 1 据我所知 SK
  • android.os.ServiceSpecificException:GPIO2_IO02 已在使用中(代码 16)

    我正在研究 android 的东西 Pico i MX7D I O 我得到了android os ServiceSpecificException GPIO2 IO02 已在使用中 代码 16 异常 这是什么意思 请帮我 我的示例程序是从克
  • Spring中有Spring惰性代理工厂吗?

    Wicket 有一个称为惰性代理工厂的设备 鉴于
  • 调整 ctypes 数组的大小

    我想调整 ctypes 数组的大小 如您所见 ctypes resize 无法正常工作 我可以编写一个函数来调整数组大小 但我想知道一些其他解决方案 也许我错过了一些 ctypes 技巧 或者也许我只是错误地使用了调整大小 名称 c lon
  • 在 Javascript 中向 css 样式属性添加 1

    我试图首先获取元素的 order 属性的值 然后在单击按钮时向其添加 1 问题是 我得到的是 11 而不是得到 1 再加上 1 再得到 2 运算符不应该添加这些值吗 我究竟做错了什么 carouselPrev addEventListene
  • 如何在 R 上为每个方面(条形图)注释不同的值?

    我想知道如何注释条形图中的每个方面 现在 我正在使用 geom signif 函数 该函数工作完美 只是它将一个面上的注释复制到另一个面上 我的代码是这样的 geom signif annotation c p 0 01 y positio
  • 指针运动。为什么数字这么高?为什么它以块而不是恒定流的形式打印信息?

    你好 我正在尝试编写一个程序 需要报告每个鼠标运动的位置 我已经打电话给XSelectInput 函数与PointerMotionMask面具 一切似乎都正常 但打印后的数字不会在每次移动后出现 它们以块的形式出现 并且也以块的形式出现ev
  • 如何正确地将 CSV 文件解析为二维数组?

    我正在尝试将 csv 文件解析为二维数组 其中每一行都是一个数据条目 每一列都是该条目中的一个字段 一次性完成这一切可以简化处理代码并将其与解析代码分开 我尝试编写一个简单的解析器 使用String Split用逗号分隔文件 据我发现 这是
  • Oracle - 不能在 select 子句中与其他列一起使用 * 符号

    抱歉 如果它很微不足道 但是选择列 标志并不总是有效 而且我没有找到对此行为的参考 我可以选择表格A和列col并附有以下声明 select from A and select col from A and select aa col aa
  • SQLAlchemy - 当 count() 表示还有更多结果时,仅返回一个结果

    我遇到了一个非常大的结果集只返回一行的问题 Session query TestSet join Instance count gt gt 4283878 Session query TestSet join Instance offset
  • HttpURLConnection Post:输出流没有效果?

    我正在开发一个 Android 应用程序 并且已经发现不同的 Android 版本在处理 Http s URLConnections 方面有不同的方式 http stackoverflow com q 9556316 151682 我遇到了