python中对于POST请求解析,及与android的交互

python中对于POST请求解析,及与android的交互

    • python中对于post等的报文解析
    • 对于图片地传输
    • android端报文形式

刚开始准备写博客,在以后的日子里,也会陆续写一些研究过程中或者项目中可能遇到的一些小的demo,以备以后能够更快的调用。
在本次中主要是实现对于python与android之间通过http等的方式交互

python中对于post等的报文解析

在本次的分析中,相对于原来的原生socket的实现,在这里使用了封装更加方便地wsgiref模块,具体模块地API开发文档可见[wsgirefAPI开发文档],在这里只是介绍自己用到地一些功能。

import wsgiref
from wsgiref.simple_server import make_server
from wsgiref.util import setup_testing_defaults
from urllib import parse
def application(environ, start_response):

   # environ是当前请求的所有数据,包括Header和URL,body
   #实现文档地报头
    start_response('200 OK', [('Content-Type', '#text/html')])  
 
    return [**] #需要返回数据,以byte地形式
if __name__ == "__main__":
    port = 6088  #端口号
    httpd = make_server("0.0.0.0", port, application)
    print( "serving http on port {0}...".format(str(port)))
    httpd.serve_forever()

以上主要实现了实现了基本地请求过程。
其中Content-Type,可以根据自己地需求改变 Content-Type对应表
相应地如果需要获取解析POST中地报文信息,可以在application中添加如下代码

  #以下获取报文地长度
    try:
        request_body_size = int(environ.get('CONTENT_LENGTH'))
    except (ValueError):
        request_body_size = 0
    #request_body 为获取到的信息。
    request_body = environ['wsgi.input'].read(request_body_size)
    print(request_body)
    #当然也可以通过如下地方式获取url
     url = wsgiref.util.request_uri(environ, include_query=1) 

对于图片地传输

因为在使用地过程中需要针对照片传输。所以添加了部分对于照片地操作。

#通过如下方式实现对于照片读取
  with open(path,'rb') as f:
        image=f.read()
    f.close()
 #因为读取地是二进制地数据,一次可以直接通过return [image,]地方式传回html
#对于收到地图片通过 wb 地方式进行数据写
 with open('test.png','wb') as f:
        f.write(request_body)
    f.close()

特别的在写的过程中要注意路径地存储,可以通过OS获取到绝对路径,进行替换

import os
BASE_OIR=os.path.abspath(__file__)

android端报文形式

主要可以通过如下两种方式
1 更加详细地参数表达

String url ="http://www.xxxx.com:端口号/xxx";
            
                // 创建连接
                HttpClient httpClient = new DefaultHttpClient();
                HttpPost post = new HttpPost(url);
                // 设置参数,仿html表单提交
                List paramList = new ArrayList();
                BasicNameValuePair param1 = new BasicNameValuePair("name",
                        "xxx");
                BasicNameValuePair param2 = new BasicNameValuePair("pass",
                        "xxx");
                paramList.add(param1);paramList.add(param2);

                post.setEntity(new UrlEncodedFormEntity(paramList, HTTP.UTF_8));
                // 发送HttpPost请求,并返回HttpResponse对象
                HttpResponse httpResponse = httpClient.execute(post);
                // 判断请求响应状态码,状态码为200表示服务端成功响应了客户端的请求
                if (httpResponse.getStatusLine().getStatusCode() == 200) {
                    // 获取返回结果
                    String result = EntityUtils.toString(httpResponse
                            .getEntity());
                    System.out.println(result);
                    Log.i("sm", result);

2 使用httpURLConnection地形式

 //1,找水源--创建URL
            URL url = new URL("https://www.baidu.com/");//放网站
            //2,开水闸--openConnection
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            //3,建管道--InputStream
            InputStream inputStream = httpURLConnection.getInputStream();
            //4,建蓄水池蓄水-InputStreamReader
            InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
            //5,水桶盛水--BufferedReader
            BufferedReader bufferedReader = new BufferedReader(reader);

            StringBuffer buffer = new StringBuffer();
            String temp = null;

            while ((temp = bufferedReader.readLine()) != null) {
                //取水--如果不为空就一直取
                buffer.append(temp);
            }
            bufferedReader.close();//记得关闭
            reader.close();
            inputStream.close();
            Log.e("MAIN",buffer.toString());//打印结果
--

你可能感兴趣的:(python中对于POST请求解析,及与android的交互)