2016-12-18 3 views
0

Я пытался отправить HTTP-запрос с Android с помощью фрагментов кодов, которые я нашел в SO, но у меня возникли две проблемы. Во-первых, как я могу поместить заголовок в свой HTTP-запрос. Во-вторых, когда я пытаюсь выполнить его (httpclient.execute), я получаю следующую ошибку. Я уже пробовал URL с расширенным клиентом отдыха и получил действительный ответ.Ошибка при отправке запроса HTTP-запроса от android

Вот запрос Преуспевающий

POST /api/v1/login/ HTTP/1.1 
HOST: api.example.com 
user-agent: Example 
content-type: application/json 
content-length: 47 

{"username":"test", "password":"123456"} 

Вот мой код.

String restUrl="https://api.example.com/api/v1/login/"; 

     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(restUrl); 

     try { 
      // Add your data 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
      nameValuePairs.add(new BasicNameValuePair("username", mJidView.getText().toString())); 
      nameValuePairs.add(new BasicNameValuePair("password",mPasswordView.getText().toString())); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

      // Execute HTTP Post Request 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 

Я получаю ошибку в httpclient.execute (HttpPost) Вот дополнительный LogCat.

at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303) 
         at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:86) 
         at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:74) 
         at java.net.InetAddress.getAllByName(InetAddress.java:752) 
         at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:142) 
         at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169) 
         at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124) 
         at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:366) 
         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560) 
         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492) 
         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470) 

ответ

1

http не рекомендуется отправлять запросы, которые вы можете изменить на залп.

смотрите по этой ссылке:

volley Google developers

и если вам нужна помощь, вы можете попробовать найти здесь или в Интернете.

+0

Я также посмотрю на это, но вы можете определить проблему здесь. В SO есть другие люди, которые сделали это так, но моя программа продолжает давать эту ошибку – Prethia

+0

, вероятно, потому, что Google устарел HTTP-запрос в android. см. эту ссылку, чтобы лучше понять [link] (http://stackoverflow.com/questions/29294479/android-deprecated-apache-module-httpclient-httpresponse-etc) –

+0

залп кажется хорошим, я поддерживаю ваш ответ – Prethia

1

Возможно, у вас включен StrictMode, и вы делаете свой HTTP-запрос в основном потоке, который не разрешен в Android прямо сейчас.

Пожалуйста, сделайте запрос в рабочей нити, или изменить политику StrictMode:

Error StrictMode$AndroidBlockGuardPolicy.onNetwork

Но вообще - вы должны сделать запрос в рабочей нити.

+0

Да, это сработало, когда Я изменил строгую политику. Этот ответ правильный. Я буду принимать его после того, как найду, как поставить заголовки – Prethia

+0

. Проверьте это: http://stackoverflow.com/a/17826541/4220692 –

-1

Вы пробовали настроить заголовок для вашего запроса на отправку? как этот

httpPost.addHeader("content-type", "application/x-www-form-urlencoded;charset=UTF-8"); 
httpPost.setHeader("Accept", "application/json"); 
httpPost.setHeader("Accept-Charset", "utf-8"); 
httpPost.setEntity(new UrlEncodedFormEntity(NameValuePairs, "UTF-8")); 

Edit:

Строка restUrl = "https://api.example.com/api/v1/login/";

HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost(restUrl); 

    try { 
     // Add your data 
     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
     nameValuePairs.add(new BasicNameValuePair("username", mJidView.getText().toString())); 
     nameValuePairs.add(new  BasicNameValuePair("password",mPasswordView.getText().toString())); 
     httpPost.addHeader("content-type", "application/x-www-form-urlencoded; charset=UTF-8"); 
     httpPost.setHeader("Accept", "application/json"); 
     httpPost.setHeader("Accept-Charset", "utf-8"); 

     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); 
     }catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 

     // Execute HTTP Post Request 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
+0

Один вопрос. Что представляет ссылка в addHeader (тип содержимого)? Потому что я уже создал httpPost с предоставлением моего Url его конструктору. Можете ли вы отформатировать свой ответ в соответствии с моим кодом – Prethia

+0

, обратитесь к http://stackoverflow.com/a/4073451/7298172 – AndroidNewbie

+0

@AndroidNewbie does '{" username ":" test "," password ":" 123456 "}' выглядит как 'x-www-form-urlencoded' для вас? – Selvin

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