2014-10-27 2 views
1

Я пытаюсь отправить запрос 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 (даже не нулевые значения вместо поля «ник», в котором говорится, что проблема заключается в том, что почтовый запрос не выполняется по какой-то причине). По всем сообщениям, которые я прочитал, это должно сработать. Есть что-то, что я забываю, что не позволяет мне заполнить почтовый запрос? Я бы очень признателен за любую помощь.

+0

Считаете ли вы, что ответ на вопрос, есть ли у сервера что-нибудь о вашем запросе? – njzk2

+0

или есть что-нибудь вообще в журналах на стороне Android? вы ловите исключение и не регистрируете их? – njzk2

+0

Hi njzk2, спасибо за ответ!Взгляд на фактический httpresponse оказался действительно полезным. Вскоре напишу ответ. – Pete

ответ

1

По предложению njzk2 я использовал InputStream, чтобы посмотреть содержимое HttpResponse. Для справки, это код, который я использовал:

InputStream iStream = response.getEntity().getContent(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(iStream)); 
while ((tempString = reader.readLine()) != null) { 
    postResponseOutput += tempString; 
} 
Log.d("HttpResponse Output", postResponseOutput); 

Для усеченной формы, я сделал ошибку, требуя вход на URL в/testForm, поэтому вход в Google, странице был возвращен, а не моя формы. Удаление этого ограничения заставило форму работать отлично.

Пробовав его с помощью MultipartEntityBuilder, раздел моего кода возвратил что-то интересное в ответ на сообщение, не более, чем «Тип контента запроса не принимается по этому URL-адресу». Но попытка сделать это с помощью секции MultipartEntity, похоже, сделала трюк. Httpresponse возвратил внутреннюю ошибку сервера (что-то делать с аутентификацией пользователя). Это объясняет, почему публикация в исходной веб-форме не работала - произошла ошибка сервера, которая предотвращала доступ к форме в первую очередь. Я верю, что как только я разрешу ошибку, что форма будет работать так же хорошо, как и для моего testForm.

+0

в качестве примечания: различие между вашим multipartEntity и вашим multipartEntityBuilder является типом содержимого StringBody: в первом случае вы указываете 'ContentType.MULTIPART_FORM_DATA', во втором случае вы этого не делаете, а значение по умолчанию -' ' text/plain "' – njzk2

+0

Хорошо, это имеет смысл. Есть ли преимущество использования одного над другим? – Pete

+0

строитель против не-строителя? на самом деле, нет. строитель следует за шаблоном построителя, который позволяет вам цепочки вызовов. это действительно только то, что вы предпочитаете использовать. за сценой, строитель действительно просто вызывает те же методы. – njzk2

Смежные вопросы