HttpURLConnection的get/post+服务端

httpURLConnection使用get方法发送少量请求参数数据到后台,后台到数据库获取数据。

  • 一开始并没能获取到后台数据总是报出这样的错:
  •  Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.
    java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
  • 后来网上查找了资料,说是Tomcat9.0版本后出了新规定,对URL的书写更加严格,只接收英文字母和数字和一些特殊字符,这里请求的参数是中文所以不行,当经过把中文编码后变成类似:
  • %DEC887%SDW3324%的形式发送出去就可以接收。于是写了如下代码

连接地址和参数:

           String name="唐静姝";
            String sex="女";
            try {
        //tomcat9版本不接收链接地址中的中文字符,需要进行编码才能接收
                name=URLEncoder.encode(name, "utf-8");
                sex=URLEncoder.encode(sex, "utf-8");
            } catch (UnsupportedEncodingException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            //?号隔开地址和参数,参数和参数间用&连接
            String Url=arg0[0]+"?name="+name+"&sex="+sex;

HTTP的get方法

安卓端的主要部分代码:

/**
 * 
 * @author httpURLConnection的get方法获取数据库数据
 *
 */
public class PersonGetActivity  extends Activity{ 
	TextView tv_name,tv_gender,tv_age,tv_hight;
	String URL="http://ly-and-tl.uicp.cn:42696/AndroidServer/HttpURLConnection";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	// TODO Auto-generated method stub
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.item);
    	init();
    	new TASK().execute(URL);
    }
    
    void init(){
    	tv_name=(TextView) findViewById(R.id.tv_name);
    	tv_gender=(TextView) findViewById(R.id.tv_gender);
    	tv_age=(TextView) findViewById(R.id.tv_age);
    	tv_hight=(TextView) findViewById(R.id.tv_hight);
    }
    
    class TASK  extends  AsyncTask<String, Void, Person>{
    	
		@Override
		protected void onPostExecute(Person result) {
			// TODO Auto-generated method stub
			if(result!=null){
				tv_name.setText(result.getName());
				tv_gender.setText(result.getSex());
				tv_age.setText(String.valueOf(result.getAge()));
				tv_hight.setText(String.valueOf(result.getHight()));
			}
		}

		@SuppressWarnings("finally")
		@Override
		protected Person doInBackground(String... arg0) {
			// TODO Auto-generated method stub
			Person person=null;
			//输入参数的设置不同点
			String name="唐静姝";
			String sex="女";
			try {
		//tomcat9版本不接收链接地址中的中文字符,需要进行编码才能接收
				name=URLEncoder.encode(name, "utf-8");
				sex=URLEncoder.encode(sex, "utf-8");
			} catch (UnsupportedEncodingException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			//?号隔开地址和参数,参数和参数间用&连接
			String Url=arg0[0]+"?name="+name+"&sex="+sex;
			String  str=null;
			StringBuffer sb=new StringBuffer();
			
			try {
				URL url=new URL(Url);
				HttpURLConnection  httpconn=(HttpURLConnection) url.openConnection();
				httpconn.setRequestMethod("GET");
				httpconn.setReadTimeout(5000);
				//发送请求
				InputStream inputStream=httpconn.getInputStream();
				InputStreamReader inputReader=new InputStreamReader(inputStream);
				BufferedReader buff=new BufferedReader(inputReader);
				while((str=buff.readLine())!=null){
					sb.append(str);
				}
				Gson gson=new Gson();
				String ss=new String(sb);
				System.out.println(ss);
	            person=gson.fromJson(ss, new TypeToken<Person>(){}.getType());
	            System.out.println(person.getName());
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				return person;
			}
		}
    }
}

服务端的代码:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO 自动生成的方法存根
		//Request.getParameter()也可以接收到安卓端的参数
		String name=req.getParameter("name");
		String sex=req.getParameter("sex");
		Connection con=null;
		ResultSet result=null;
		PreparedStatement prep=null;
		String sql="select * from stu_info where name=? and sex=?";
		StudentHealthJavaBean student=null;
		con=DataBaseConnection.getConnection();
		if(con!=null) {
			try {
				prep=con.prepareStatement(sql);
				prep.setString(1, name);
				prep.setString(2, sex);
				result=prep.executeQuery();
				if(result.next()) {
					student=new StudentHealthJavaBean();
					student.setName(result.getString("name"));
					student.setAge(result.getInt("age"));
					student.setId(result.getString("id"));
					student.setSex(result.getString("sex"));
					student.setHight(result.getFloat("hight"));
					student.setWeight(result.getFloat("weight"));
				}
				Gson json=new Gson();
				String str=json.toJson(student);
				resp.setCharacterEncoding("utf-8");
				PrintWriter p=resp.getWriter();
				p.println(str);
				DataBaseConnection.closeDatabaseConnection(con, prep, result);
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}
	}

http的post方法:

安卓端主要部分代码显示:

public class PersonPostActivity  extends Activity{ 
	TextView textView;
	String URL="http://ly-and-tl.uicp.cn:42696/AndroidServer/HttpURLConnection";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	// TODO Auto-generated method stub
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.activity_main);
        textView=(TextView) findViewById(R.id.textView);
    	new TASK().execute(URL);
    }
 
    class TASK  extends  AsyncTask<String, Void,String>{
    	
    	@Override
		protected void onPostExecute(String result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);
			textView.setText(result);
		}

		@SuppressWarnings("finally")
		protected String doInBackground(String... arg0) {
			//输出手机属性
			Properties propertys=System.getProperties();
			propertys.list(System.out);
			//找到其中的encoding看手机编码
			StringBuffer sb=new StringBuffer();
			// TODO Auto-generated method stub
			//输入参数的设置不同点
			String name="俾路支";
			String sex="男";
			String id="13";
			int age=25;
			float hight=165;
			float weight=98;
			//?号隔开地址和参数,参数和参数间用&连接
			String Url=arg0[0];
//post和get的不同之处在这里			
String property="id="+id+"&name="+name+"&sex="+sex+"&age="+age+"&hight="+hight+"&weight="+weight;
			String  str=null;
			
			try {
				URL url=new URL(Url);
				HttpURLConnection  httpconn=(HttpURLConnection) url.openConnection();
				httpconn.setRequestMethod("POST");//区别
				httpconn.setReadTimeout(5000);
//post和get的不同之处				
				OutputStream outs=httpconn.getOutputStream();
                            outs.write(property.getBytes("UTF-8"));
				//发送请求
				InputStream inputStream=httpconn.getInputStream();
				InputStreamReader inputReader=new InputStreamReader(inputStream);
				BufferedReader buff=new BufferedReader(inputReader);
				while((str=buff.readLine())!=null){
					sb.append(str);
				}
		       if("插入成功!".equals(sb))
		    	   System.out.println("插入成功!");
				textView.setText(sb);
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				return new String(sb);
			}
		}
    }
}

服务端主要部分代码展示:

@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO 自动生成的方法存根
		//super.doPost(req, resp);
		String id=req.getParameter("id");
		//因为服务器端的首选编码是iso-8859-1,不是utf-8
		//先按照系统默认编码把它转成字节数组,然后再把数组转成字符串
		id=new String(id.getBytes(),"utf-8");
		String name=req.getParameter("name");
		name=new String(name.getBytes(),"utf-8");
		String sex=req.getParameter("sex");
		sex=new String(sex.getBytes(),"utf-8");
		System.out.println(name+sex);
		int age=Integer.parseInt(req.getParameter("age"));
		float weight=Float.parseFloat(req.getParameter("weight"));
		float hight=Float.parseFloat(req.getParameter("hight"));
		Connection con=null;
		PreparedStatement prep=null;
		ResultSet result=null;
		String sql="insert into stu_info(id,name,sex,age,weight,hight) values(?,?,?,?,?,?)";
		con=DataBaseConnection.getConnection();
		if(con!=null) {
			try {
				prep=con.prepareStatement(sql);
				prep.setString(1, id);
				prep.setString(2, name);
				prep.setString(3, sex);
				prep.setInt(4, age);
				prep.setFloat(5, weight);
				prep.setFloat(6, hight);
				int n=prep.executeUpdate();
				if(n!=0)System.out.println("插入成功!");
				resp.setCharacterEncoding("utf-8");
				//设置这个页面的编码格式,如果不设置在这个页面会显示乱码
				//resp.setContentType("text/html;charset=");
				PrintWriter p=resp.getWriter();
				p.println("插入成功!");
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}finally {
				DataBaseConnection.closeDatabaseConnection(con, prep, result);
			}
		}
	}

猜你喜欢

转载自my.oschina.net/u/3630543/blog/1799930