【问题标题】:Error while sending a GET Request to a servlet from android从android向servlet发送GET请求时出错
【发布时间】:2014-05-22 10:59:49
【问题描述】:

搜索后我能够从我的 servlet 检索响应,但我无法将参数(用户名和密码参数)从 android 发送到 servlet!我的 logcat 显示此错误:

04-0java.lang.ClassCastException: org.apache.http.client.methods.HttpGet cannot be cast to org.apache.http.HttpResponse
at com.example.httpgetandroidexample.MainActivity$AsyncTaskRunner.doInBackground(MainActivity.java:76)
at com.example.httpgetandroidexample.MainActivity$AsyncTaskRunner.doInBackground(MainActivity.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)

我不明白为什么! 这是我的 android 主要活动:

package com.example.httpgetandroidexample;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

               public TextView content;
                EditText name,pass;
                String URL,nameValue,passValue;
            @Override
            protected void onCreate(Bundle savedInstanceState) {

                      super.onCreate(savedInstanceState);
                     setContentView(R.layout.activity_main);

                     name      =  (EditText)findViewById(R.id.name);
                     pass       =  (EditText)findViewById(R.id.pass);
                     content       =  (TextView)findViewById(R.id.text);

                   Button button=(Button)findViewById(R.id.but);
                   try {
                    nameValue    =URLEncoder.encode(name.getText().toString(), "UTF-8");
                    passValue    =URLEncoder.encode(pass.getText().toString(), "UTF-8");
                       URL = "http://10.0.2.2:8080/login/web";
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }

                   button.setOnClickListener(new View.OnClickListener() {
                       @Override
                       public void onClick(View v) {
                        AsyncTaskRunner runner = new AsyncTaskRunner();
                        runner.execute(new String[ ] { URL });
                       }
                      });


   }
            private class AsyncTaskRunner extends AsyncTask<String, Void, String> {


                @Override
                protected String doInBackground(String... urls) {

                  String response = "";
                  for (String url : urls) {
                    DefaultHttpClient client = new DefaultHttpClient();
                    HttpGet httpGet = new HttpGet(url);
                    try {
                        List<NameValuePair> postParameters = 
                                new ArrayList<NameValuePair>();
                            postParameters.add(new BasicNameValuePair("user",nameValue));
                            postParameters.add(new BasicNameValuePair("pass",passValue));
                            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(
                                    postParameters);
                            ((HttpResponse) httpGet).setEntity(formEntity);
                      HttpResponse execute = client.execute(httpGet);
                      InputStream content = execute.getEntity().getContent();

                      BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
                      String s = "";
                      while ((s = buffer.readLine()) != null) {
                        response += s;
                      }

                    } catch (Exception e) {
                      e.printStackTrace();
                    }
                  }
                  return response;
                }

                @Override
                protected void onPostExecute(String result) {
                  content.setText(result);
                }
              }
}

有人知道吗?

更新:

now i have changed my android code like this:
package com.example.httpgetandroidexample;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

               public TextView content;
                EditText name,pass;
                String URL;
            @Override
            protected void onCreate(Bundle savedInstanceState) {

                      super.onCreate(savedInstanceState);
                     setContentView(R.layout.activity_main);

                     name      =  (EditText)findViewById(R.id.name);
                     pass       =  (EditText)findViewById(R.id.pass);
                     content       =  (TextView)findViewById(R.id.text);

                   Button button=(Button)findViewById(R.id.but);
                   try {
                    String nameValue    ="user="+URLEncoder.encode(name.getText().toString(), "UTF-8");
                    String passValue    ="&pass="+URLEncoder.encode(pass.getText().toString(), "UTF-8");
                       URL = "http://10.0.2.2:8080/login/web?"+nameValue+passValue;
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }

                   button.setOnClickListener(new View.OnClickListener() {
                       @Override
                       public void onClick(View v) {
                        AsyncTaskRunner runner = new AsyncTaskRunner();
                        runner.execute(new String[ ] { URL });
                       }
                      });


   }
            private class AsyncTaskRunner extends AsyncTask<String, Void, String> {


                @Override
                protected String doInBackground(String... urls) {

                  String response = "";
                  for (String url : urls) {
                    DefaultHttpClient client = new DefaultHttpClient();
                    HttpGet httpGet = new HttpGet(url);
                    try {

                      HttpResponse execute = client.execute(httpGet);
                      InputStream content = execute.getEntity().getContent();

                      BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
                      String s = "";
                      while ((s = buffer.readLine()) != null) {
                        response += s;
                      }

                    } catch (Exception e) {
                      e.printStackTrace();
                    }
                  }
                  return response;
                }

                @Override
                protected void onPostExecute(String result) {
                  content.setText(result);
                }
              }
}

这次运行没有logcat错误但是参数没有传到servlet!

【问题讨论】:

  • 我认为您在 HTTP GET 和 HTTP POST 之间混用。选择其中之一,但不能同时选择两者。你想做什么?我看到您正在尝试传递 userpass
  • 我只是试图通过 GET 方法将 2 个参数(用户,传递)发送到 servlet,并从 servlet 获得响应并显示它。我可以从 servlet 获得响应,但我无法发送参数到服务器!

标签: java android servlets


【解决方案1】:

我已经修改了活动,问题是 URLnameValuepassValue 在代码的错误部分声明!这是正确的android代码:

package com.example.httpgetandroidexample;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

               public TextView content;
                EditText name,pass;
                String URL,nameValue,passValue;
            @Override
            protected void onCreate(Bundle savedInstanceState) {

                      super.onCreate(savedInstanceState);
                     setContentView(R.layout.activity_main);

                     name      =  (EditText)findViewById(R.id.name);
                     pass       =  (EditText)findViewById(R.id.pass);
                     content       =  (TextView)findViewById(R.id.text);
                     content.setText("Vendosni Perdoruesin dhe Fjalekalimin");
                   Button button=(Button)findViewById(R.id.but);



                   button.setOnClickListener(new View.OnClickListener() {
                       @Override
                       public void onClick(View v) {
                           nameValue="&user="+name.getText().toString();
                           passValue    ="&pass="+pass.getText().toString();
                           URL = "http://10.0.2.2:8080/login/web2?activitetiNR=1"+nameValue+passValue;
                        AsyncTaskRunner runner = new AsyncTaskRunner();

                           Log.i("url",URL);
                           Log.i("url",nameValue);
                           Log.i("url",passValue);
                        runner.execute(new String[ ] { URL });
                       }
                      });


   }
            private class AsyncTaskRunner extends AsyncTask<String, Void, String> {


                @Override
                protected String doInBackground(String... urls) {

                  String response = "";
                  for (String url : urls) {
                    DefaultHttpClient client = new DefaultHttpClient();
                    HttpGet httpGet = new HttpGet(url);
                    try {

                      HttpResponse execute = client.execute(httpGet);
                      InputStream content = execute.getEntity().getContent();

                      BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
                      String s = "";
                      while ((s = buffer.readLine()) != null) {
                        response += s;
                      }

                    } catch (Exception e) {
                      e.printStackTrace();
                    }
                  }
                  return response;
                }

                @Override
                protected void onPostExecute(String result) {
                  content.setText(result);
                }
              }
} 

【讨论】:

    【解决方案2】:

    查看堆栈跟踪,我猜你的问题出在这一行。

    ((HttpResponse) httpGet).setEntity(formEntity);
    

    你为什么要把它投射到HttpResponse

    好的。您想使用 HTTP GET 发送用户/传递参数。对于 HTTP GET,所有参数都是 URL 的一部分。也许这可以为您提供一些关于如何执行 HTTP GET 和传递参数的帮助。但总的来说,URL 应该是这样的

    http://www.blah.com/servlet?user="1234"&amp;pass="password"

    URL 中? 后面的内容包含所有参数。但是 URL 有长度限制,如果超过这个长度,就必须使用 HTTP POST。

    试试这个链接看看它是否可以帮助你 http://androidexample.com/How_To_Make_HTTP_Get_Request_To_Server_-_Android_Example/index.php?view=article_discription&aid=63&aaid=88

    【讨论】:

    • 因为如果我不投射 Eclipse 会显示错误!它在 setEntity() 方法上显示错误 The method setEntity(UrlEncodedFormEntity) is undefined for the type HttpGet
    • 当然,HTTP GET 请求缺少正文,但您可以尝试使用 HTTP POST。将 HttpGet 请求转换为响应没有意义。
    • 如果你想发送 HTTP POST,实例化一个HttpPost 并在其上调用setEntity
    • 感谢您的回复,我更新了 android 代码,但在 servlet 方面却一无所获,我不明白为什么!
    • @p3rand0r 首先要确保发送正确的 URL 请求(即打印出 URL)。然后在 servlet 端检查是否收到了请求(即 Tomcat 日志)。如果你有一个 TCP 嗅探器(例如,wireshark),把它打开并在 LAN 接口上窥探以查看实际进入服务器的内容。
    猜你喜欢
    • 1970-01-01
    • 2023-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    相关资源
    最近更新 更多