【发布时间】:2014-08-04 23:37:53
【问题描述】:
我使用以下代码将二进制数据从 Android 应用程序发送到 CGI C++ 程序(在 AsyncTask 中的 doInBackground 中调用):
public static HttpResponse makeRequestPost(String uri, MyObject obj) {
try {
HttpPost httpPost = new HttpPost(uri);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
DataOutputStream dataStream = new DataOutputStream(stream);
obj.writeRawObject(dataStream);
byte[] byteArray = stream.toByteArray();
ByteArrayEntity entity = new ByteArrayEntity(byteArray);
entity.setContentType("application/octet-stream");
entity.setChunked(true);
httpPost.setEntity(entity);
return new DefaultHttpClient().execute(httpPost);
} catch (UnsupportedEncodingException e) {
Log.e(TAG, "UnsupportedEncodingException. " + e.getMessage());
} catch (ClientProtocolException e) {
Log.e(TAG, "ClientProtocolException. " + e.getMessage());
} catch (IOException e) {
Log.e(TAG, "IOException. " + e.getMessage());
}
return null;
}
我使用 CURL 测试了同一台服务器,并将数据写入文件中:
obj.writeRawObject(dataStream);
此外,上述代码中的 byteArray 和实体变量在调用 execute(httpPost) 之前都包含正确的数据。
由于某种原因,在服务器端
char* lenstr = getenv("CONTENT_LENGTH");
当我运行应用程序时返回 NULL。我尝试发送的数据从几个字节到 30 kB。无论大小,它都不会在服务器端获取它们。应用程序可以与服务器通信,但不附加二进制数据。这是我想念的东西吗?
这样的东西在 CURL 中起作用:
curl -i -H "Content-Type:application/octet-stream" -X POST --data-binary @file_with_my_obj.bin <url>
欣赏任何想法。
【问题讨论】:
-
与其尝试从
curl直接跳转到android 应用程序,不如先编写一个普通的Java 应用程序并成功地让它与您的服务器通信,它可能会帮助您更好地调试。一旦这样做了,在 Android 上的调试就会容易得多。 -
将其作为普通 Java 应用程序检查是个好主意。奇怪的是,问题出在 entity.setChunked(true);没有那条线,它工作正常。我不太明白为什么。