• post上传和压缩、插件模拟请求


     

    gzip

    gzip一种压缩方式,或者是文件形式,它主要用于网络传输数据的压缩

    gzip压缩好不好用

    • 浏览器:网速一定.内容越小.请求响应的速度是不是更快
    • 手机server:返回数据类型是json/xml->文本-->压缩率会很高.

    gzip执行流程

    • //1. 告知服务器.客户端支持gzip解压

      * get.addHeader("Accept-Encoding", "gzip");
      
    • //2. 根据响应头得知服务器知否进行了gzip压缩

      * Header[] headers = response.getHeaders("Content-Encoding");
          for (Header header : headers) {
              if ("gzip".equals(header.getValue())) {
                  isUseGzip = true;
              }
      }
      
    • //3.根据是否使用gzip.解压具体的数据

      if (isUseGzip) {
          GZIPInputStream in = new GZIPInputStream(entity.getContent());
          result = IoUtils.convertStreamToString(in);
      } else {
          result = EntityUtils.toString(entity);
      }
      
    • 服务端具体怎么支持gzip压缩.根据使用的服务器语言来定

    post请求参数的形式

    • key-value--->表单:结构比较单一.而且比较繁琐

      List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
          for (String key : parmas.keySet()) {
              BasicNameValuePair basicNameValuePair = new BasicNameValuePair(key, parmas.get(key));
              parameters.add(basicNameValuePair);
          }
          UrlEncodedFormEntity form = new UrlEncodedFormEntity(parameters);
          post.setEntity(form);
      
    • jsonString形式:结构灵活.实际开发用的很多

          post.setEntity(new StringEntity(jsonString));
      
    • file形式:需要jar包httpmime:很多框架上传图片就是用他

          MultipartEntity entity = new MultipartEntity();
          entity.addPart("actimg", new FileBody(file));
          post.setEntity(entity);
      
    • 多张图片上传:写个循环,用键值,可以用BasicNameValuePair,也可以用file,循环添加,也可以用base64变成string上传
    • Base64:byte[]-->string
      • 上传图片,语音:
      • 存对象到sp:如map
    	iv = (ImageView) findViewById(R.id.iv);
    		findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				//1.bitmap
    				Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
    				//2. bitmap-->byte[]
    				ByteArrayOutputStream baos = new ByteArrayOutputStream();
    				bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
    				byte[] byteArray = baos.toByteArray();
    				//3.byte[]->string,这样就可以用string传给服务器
    				String bitmapString = Base64.encodeToString(byteArray, Base64.DEFAULT);
    				System.out.println("bitmapString :" + bitmapString);
    				//4. string-->byte[];
    				byte[] bitmapByteArr = Base64.decode(bitmapString, Base64.DEFAULT);
    				//5.byte[]-->bitmap
    				Bitmap bitmap2 = BitmapFactory.decodeByteArray(bitmapByteArr, 0, bitmapByteArr.length);
    				//6.在imageView上设置图片
    				iv.setImageBitmap(bitmap2);
    				//obj-->byte[] -->string->sp
    			}
    		});
    

      

    post的content-type

    • application/x-www-form-urlencoded :表单类型-->key-value,默认
    • multipart/form-data :文件上传
    • application/json :jsonString
    • text/xml :xml
    • text/plain:文本
    • post.addHeader("Content-Type", "application/json");//如果后台固定死了.不加请求头.同样返回json那就没问题.但是如果后台逻辑和这个请求头有关系.就必须要加上.可以肯定的说.加了万无一失
     
     

    MainActivity

    public class MainActivity extends Activity {
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		initGzip();
    		Map<String, String> map = new HashMap<String, String>();
    		map.put("name", "billy");
    		
    		
    		initPostKeyValue(map);
    		String jsonString = "{"name":"billy"}";
    		initPostJsonString(jsonString);
    		File file = new File("");
    		initPostFile(file);
    	}
    	/**
    	 * 文件的上传
    	 * @param file
    	 */
    	private void initPostFile(File file) {
    		try {
    			DefaultHttpClient httpClient = new DefaultHttpClient();
    			HttpPost post = new HttpPost("");
    			//2. 传递二进制类型的参数
    			MultipartEntity entity = new MultipartEntity();
    			entity.addPart("actimg", new FileBody(file));
    			post.setEntity(entity);
    			httpClient.execute(post);
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	/**
    	 * 使用jsonString post数据库
    	 * @param jsonString
    	 */
    	private void initPostJsonString(String jsonString) {
    		try {
    			DefaultHttpClient httpClient = new DefaultHttpClient();
    			HttpPost post = new HttpPost("");
    			post.addHeader("Content-Type", "application/json");
    			//Content-Type text/xml-->xml
    			//Content-Type application/json-->json
    			//2. 传递jsonString类型的参数
    			post.setEntity(new StringEntity(jsonString));
    			httpClient.execute(post);
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	/**
    	 * 使用key-value的形式post数据
    	 * @param parmas 请求参数对于的map集合
    	 */
    	private void initPostKeyValue(Map<String, String> parmas) {
    		try {
    			DefaultHttpClient httpClient = new DefaultHttpClient();
    			HttpPost post = new HttpPost("");
    			//1. 传递key-value的参数
    			List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
    			for (String key : parmas.keySet()) {
    				BasicNameValuePair basicNameValuePair = new BasicNameValuePair(key, parmas.get(key));
    				parameters.add(basicNameValuePair);
    			}
    			UrlEncodedFormEntity form = new UrlEncodedFormEntity(parameters);
    			post.setEntity(form);
    			httpClient.execute(post);
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	private void initGzip() {
    		findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				new Thread(new Runnable() {
    					@Override
    					public void run() {
    						try {
    							boolean isUseGzip = false;
    							DefaultHttpClient httpClient = new DefaultHttpClient();
    							HttpGet get = new HttpGet("http://httpbin.org/gzip");
    							//1. 告知服务器.客户端支持gzip解压
    							get.addHeader("Accept-Encoding", "gzip");
    							HttpResponse response = httpClient.execute(get);
    							if (response.getStatusLine().getStatusCode() == 200) {
    								//2. 根据响应头得知服务器知否进行了gzip压缩
    								Header[] headers = response.getHeaders("Content-Encoding");
    								for (Header header : headers) {
    									if ("gzip".equals(header.getValue())) {
    										isUseGzip = true;
    									}
    								}
    								HttpEntity entity = response.getEntity();
    								//3.根据是否使用gzip.解压具体的数据
    								String result = "";
    								if (isUseGzip) {
    									GZIPInputStream in = new GZIPInputStream(entity.getContent());
    									result = IoUtils.convertStreamToString(in);
    								} else {
    									result = EntityUtils.toString(entity);
    								}
    								System.out.println("result:" + result);
    							}
    						} catch (Exception e) {
    							// TODO Auto-generated catch block
    							e.printStackTrace();
    						}
    					}
    				}).start();
    			}
    		});
    	}
    }
    

      

     

    restclient(firfox插件),postman(谷歌浏览器)

    网络请求模拟插件,post用,get直接在浏览器网页就打开了

  • 相关阅读:
    ASP创建对象及中文显示解决方法
    webservice解读
    top监控工具
    Crontab实例
    javascript闭包的理解
    98万买下51.com域名,51.com不止2000万美金
    百度08年网页搜索份额73.2% 创历史新高
    讲故事投资 天使投资人的中国式生存
    下个谷歌将诞生于中国或印度
    Twitter入选10大搜索引擎
  • 原文地址:https://www.cnblogs.com/sixrain/p/5291547.html
Copyright © 2020-2023  润新知