Android Multipart POST para Google App Engine no funciona
Estoy desarrollando un programa android que comparte datos a través de POST con un programa de App Engine, todo en java. Cuando POST usando MultipartEntity el programa appengine no puede ver ninguna de mis variables POST por alguna razón que no puedo entender!
Código de Appengine:
- Eclipse "Android Device Chooser" - Cruz roja delante de todos los dispositivos en la columna Target
- Problema con strings.xml ... no puede pasar R.string.foo como CharSequence
- PercentRelativeLayout, cómo establecer la altura mediante programación
- Android onTouchListener en LinearLayout
- Temporizador Android actualizando una vista de texto (UI)
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/plain"); resp.getWriter().println("Output:"); String mRoutine = req.getParameter("Routine"); resp.getWriter().println("Routine: " + mRoutine); String mPMode = req.getParameter("PMode"); resp.getWriter().println("PMode: " + mPMode); }
Trabajando Android Snippet:
HttpPost post = new HttpPost("http://XXX.appspot.com/Echo"); HttpClient client = new DefaultHttpClient(); post.setEntity(new UrlEncodedFormEntity(data,HTTP.UTF_8)); HttpResponse response = client.execute(post); HttpEntity resmarkMessagesReadFrom = response.getEntity(); if (resmarkMessagesReadFrom != null) { Result_STR= "Response:\n" + EntityUtils.toString(resmarkMessagesReadFrom); mMSGBox.setText(Result_STR); }
Fallo de Android:
HttpPost post = new HttpPost("http://XXX.appspot.com/Echo"); HttpClient client = new DefaultHttpClient(); MultipartEntity reqmarkMessagesReadFrom = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); try { reqmarkMessagesReadFrom.addPart("Routine", new StringBody("Neutral")); post.setEntity(reqmarkMessagesReadFrom); HttpResponse response = client.execute(post); HttpEntity resmarkMessagesReadFrom = response.getEntity(); if (resmarkMessagesReadFrom != null) { Result_STR= "Response:\n" + EntityUtils.toString(resmarkMessagesReadFrom); mMSGBox.setText(Result_STR); }
- Android y JNI cómo pasar una matriz de datos Byte a JNI y recuperar Byte
- Juego de Multitouch de Android
- ¿Cómo obtener detalles de la aplicación de terceros en android?
- El desarrollo de Android cambia la visibilidad de TextView
- ¿Hay alguna manera de hacer compresión de imágenes y ahorrar más rápido en Android?
- ¿Cómo puedo utilizar estilos html en cadenas con argumentos de formato?
- Com.google.aaaal 400 Bad Request {"error": "invalid_grant"} al insertar una fila en bigquery
- Android: ¿cómo cambiar el color del divisor datepicker?
Utilizando la clase MultipartEntity
en el cliente, debe manejar su doPost
de una manera diferente del lado del servidor, leyendo los archivos / parámetros con una API como Apache Commons FileUpload .
Google App Engine no permite escribir en el sistema de archivos, por lo que necesitas usar la API de streaming.
import org.apache.commons.fileupload.FileItemStream; import org.apache.commons.fileupload.FileItemIterator; import org.apache.commons.fileupload.servlet.ServletFileUpload; import java.io.InputStream; .. public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { try { ServletFileUpload upload = new ServletFileUpload(); res.setContentType("text/plain"); FileItemIterator iterator = upload.getItemIterator(req); while (iterator.hasNext()) { String name = item.getFieldName(); FileItemStream item = iterator.next(); InputStream stream = item.openStream(); if (item.isFormField()) { resp.getWriter().println((name + " : " + Streams.asString(stream)); } } } catch (Exception ex) { throw new ServletException(ex); } }
La mejor respuesta que he encontrado es uno de los ejemplos propios de Google: http://code.google.com/intl/fr/appengine/kb/java.html#fileforms esto utiliza FileUpload igual que el ejemplo de systempuntoout.
import org.apache.commons.fileupload.FileItemStream; import org.apache.commons.fileupload.FileItemIterator; import org.apache.commons.fileupload.servlet.ServletFileUpload; import java.io.InputStream; import java.io.IOException; import java.util.logging.Logger; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FileUpload extends HttpServlet { private static final Logger log = Logger.getLogger(FileUpload.class.getName()); public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { try { ServletFileUpload upload = new ServletFileUpload(); res.setContentType("text/plain"); FileItemIterator iterator = upload.getItemIterator(req); while (iterator.hasNext()) { FileItemStream item = iterator.next(); InputStream stream = item.openStream(); if (item.isFormField()) { log.warning("Got a form field: " + item.getFieldName()); } else { log.warning("Got an uploaded file: " + item.getFieldName() + ", name = " + item.getName()); // You now have the filename (item.getName() and the // contents (which you can read from stream). Here we just // print them back out to the servlet output stream, but you // will probably want to do something more interesting (for // example, wrap them in a Blob and commit them to the // datastore). int len; byte[] buffer = new byte[8192]; while ((len = stream.read(buffer, 0, buffer.length)) != -1) { res.getOutputStream().write(buffer, 0, len); } } } } catch (Exception ex) { throw new ServletException(ex); } } }
- ¿Cómo obtener un método llamado con diferentes parámetros?
- Android Crashlytics plugin no instalar la biblioteca