Я пытаюсь отправить запрос POST из приложения Android в приложение Google App Engine, чтобы загрузить файл в blobstore и некоторые метаданные в хранилище данных. Я создал обычную веб-форму, которую я могу получить в браузере, и публикация оттуда работает нормально. Тем не менее, я не смог сделать то же самое с моего приложения для Android.Android HttpPost запрос не отправляет
Многие другие сообщения StackOverflow упоминают использование MultipartEntity
или MultipartEntityBuilder
для создания запроса на отправку. Первое, кажется устаревшим, но есть еще примеры, поэтому я попробовал оба пути (по отдельности, конечно):
HttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost(upload_url);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addTextBody("poem_name", "Testing poem_name from Android", ContentType.MULTIPART_FORM_DATA);
builder.addTextBody("poem_text", "blah", ContentType.MULTIPART_FORM_DATA);
postRequest.setEntity(builder.build());
HttpResponse response = httpClient.execute(postRequest);
HttpEntity theEntity = response.getEntity();
theEntity.consumeContent();
httpClient.getConnectionManager().shutdown();
и
HttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost(upload_url);
StringBody poem_name = new StringBody("Testing poem_name from Android");
StringBody poem_text = new StringBody("blah");
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
entity.addPart("poem_name", poem_name);
entity.addPart("poem_text", poem_text);
postRequest.setEntity(entity);
HttpResponse response = httpClient.execute(postRequest);
оригинальный WebForm, который работает как шарм от обычного браузера, выглядит в моем шаблоне (я пропустил загрузку файла сначала в Android код, как weas слишком проблематично отлаживать сразу):
<form action="{{ upload_url }}" method="POST" enctype="multipart/form-data">
Poem Title: <input name="poem_name" required><br>
Poem Text:<br><textarea name="poem_text" rows="5" cols="40"></textarea><br>
Upload File: <input type="file" name="file"><br>
<input type="submit" name="submit" value="Add Poem">
</form>
Однако, когда я исполняю либо из двух первых разделов кода моего приложения для Android на моем сервере ничего не отображается. Upload_url, который передается в конструктор HttpPost, является тем же самым, который используется в поле действия веб-формы {{ upload_url }}
(он динамически генерируется Google App Engine). Итак, я думал, что попробую отправить в любую веб-форму, а не в тех, которые требуют многочастных объектов и динамических URL-адресов. Я построил новый баребоны веб-форму на другой странице приложения, как так ...
<form action="/testForm" method="post">
<input name="nickname"><br>
<input type="submit" value="Create Test Entity">
</form>
... и попытался основной пост запрос, как показано на многочисленных примерах начинающих:
HttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost("http://my-app-title.appspot.com/testForm");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("nickname", "test with NameValuePair"));
postRequest.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpClient.execute(postRequest);
Разумеется, форма отлично работает в браузере, но не дает результата при выполнении этого кода из моего приложения для Android (даже не нулевые значения вместо поля «ник», в котором говорится, что проблема заключается в том, что почтовый запрос не выполняется по какой-то причине). По всем сообщениям, которые я прочитал, это должно сработать. Есть что-то, что я забываю, что не позволяет мне заполнить почтовый запрос? Я бы очень признателен за любую помощь.
Считаете ли вы, что ответ на вопрос, есть ли у сервера что-нибудь о вашем запросе? – njzk2
или есть что-нибудь вообще в журналах на стороне Android? вы ловите исключение и не регистрируете их? – njzk2
Hi njzk2, спасибо за ответ!Взгляд на фактический httpresponse оказался действительно полезным. Вскоре напишу ответ. – Pete