复制即用-python与c#间HTTP通信及传递图片

声明

只是核心代码实现功能,细节及异常自己处理下.

代码

c#端(做客户端)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace WF_Android2Python_HTTP.HTTP
{
    public class HttpHelper
    {
        // 服务端地址
        private string severUrl;
        public HttpHelper(string severUrl)
        {
            this.severUrl = severUrl;
        }

        /// <summary>
        /// Get方式发送请求命令
        /// </summary>
        /// <param name="uri">add path</param>
        /// <returns></returns>
        public string GetData(string uri)
        {
            //先根据用户请求的uri构造请求地址
            string serviceUrl = string.Format("{0}/{1}", this.severUrl, uri);
            Console.WriteLine(serviceUrl);
            //创建Web访问对象
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);
            //通过Web访问对象获取响应内容
            HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
            //通过响应内容流创建StreamReader对象,因为StreamReader更高级更快
            StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
            string returnstr = reader.ReadToEnd();
            reader.Close();
            myResponse.Close();
            Console.WriteLine(returnstr);
            return returnstr;
        }


        /// <summary>
        /// 通过post方式发送命令
        /// </summary>
        /// <param name="data">要发送的数据字符串,通常用json格式管理</param>
        /// <param name="uri">附加路径</param>
        /// <returns></returns>
        public string PostData(string data, string uri)
        {
            //先根据用户请求的uri构造请求地址
            string serviceUrl = string.Format("{0}/{1}", this.severUrl, uri);
            //创建Web访问对象
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);
            //把用户传过来的数据转成“UTF-8”的字节流
            byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);
            myRequest.Method = "POST";
            myRequest.ContentLength = buf.Length;
            myRequest.ContentType = "application/json";
            myRequest.MaximumAutomaticRedirections = 1;
            myRequest.AllowAutoRedirect = true;
            //发送请求
            Stream stream = myRequest.GetRequestStream();
            stream.Write(buf, 0, buf.Length);
            stream.Close();
            //获取接口返回值
            HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
            //通过响应内容流创建StreamReader对象,因为StreamReader更高级更快
            StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
            string returnStr = reader.ReadToEnd();
            reader.Close();
            myResponse.Close();
            return returnStr;
        }


        /// <summary>
        /// 发送参数与文件
        /// </summary>
        /// <param name="data">参数</param>
        /// <param name="picture">图像数据</param>
        /// <param name="uri">附加路径</param>
        /// <returns></returns>
        public string PostDataAndPicture(Dictionary<string, object> postParameters, byte[] picture, string uri)
        {
            //先根据用户请求的uri构造请求地址
            string serviceUrl = string.Format("{0}/{1}", this.severUrl, uri);
            // 构建连接并发送
            using (HttpClient client = new HttpClient())
            {
                // 参数部分
                var content = new MultipartFormDataContent();
                foreach (var postParam in postParameters)
                {
                    content.Add(new StringContent(postParam.Value.ToString()), postParam.Key);
                }

                // 文件部分
                string fileName = "postImageContent.jpg";
                content.Add(new ByteArrayContent(picture), "file", fileName);

                // 发送并接受反馈
                string fullResponse = client.PostAsync(serviceUrl, content).Result.Content.ReadAsStringAsync().Result;
                return fullResponse;
            }
        }
    }
}

python端(做服务端)

# python内置
import cgi
from http.server import HTTPServer, BaseHTTPRequestHandler
import json

data = {'cmdKey': 1001, 'msg':'这是一句测试反馈', 'data':1}
host = ('localhost', 8888)


class Resquest(BaseHTTPRequestHandler):

    def get_test(self):
        """ get命令的测试 """
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        rspstr = json.dumps(data)
        self.wfile.write(rspstr.encode("utf-8"))

    def post_test(self):
        """ post命令的测试 """
        data_byte = self.rfile.read(int(self.headers["content-length"]))
        data_obj = json.loads(str(data_byte, encoding = "utf-8"))
        print("获取到的请求命令为:", data_obj)
        self.send_response(200)
        self.send_header("Content-type", 'application/json')
        self.end_headers()
        rspstr = json.dumps(data)
        self.wfile.write(rspstr.encode("utf-8"))

    def post_file(self):
        """ 接收到post文件命令 """
        form = cgi.FieldStorage(
            fp=self.rfile,
            headers=self.headers,
            environ={'REQUEST_METHOD': 'POST',
                     'CONTENT_TYPE': self.headers['Content-Type'],
                     }
        )

        # 接收并保存图片
        for field in form.keys():
            field_item = form[field]
            filename = field_item.filename
            filevalue = field_item.value
            filesize = len(filevalue)  # 文件大小(字节)
            print (filename, filesize)
            with open("./images/saved.jpg", 'wb') as f:
                f.write(filevalue)
        # 给出一个反馈
        self.send_response(200)
        self.send_header("Content-type", 'application/json')
        self.end_headers()
        rspstr = json.dumps(data)
        self.wfile.write(rspstr.encode("utf-8"))


    def post_picture_param(self):
        """ 同时携带参数及文件的 multipart/form-data 请求 """
        form = cgi.FieldStorage(
            fp=self.rfile,
            headers=self.headers,
            environ={'REQUEST_METHOD': 'POST',
                     'CONTENT_TYPE': self.headers['Content-Type'],
                     }
        )

        # 接收并保存图片
        for field in form.keys():
            if str(field) != 'file':
                field_item = form[field]
                filevalue = field_item.value
                print(field, filevalue)
            else:
                field_item = form[field]
                filename = field_item.filename
                filevalue = field_item.value
                filesize = len(filevalue)  # 文件大小(字节)
                print(filename, filesize)
                with open("./images/saved.jpg", 'wb') as f:
                    f.write(filevalue)

        # 给出一个反馈
        self.send_response(200)
        self.send_header("Content-type", 'application/json')
        self.end_headers()
        rspstr = json.dumps(data)
        self.wfile.write(rspstr.encode("utf-8"))


    def post_back_file(self):
        """ 接收到post命令需要反馈文件 """
        data_byte = self.rfile.read(int(self.headers["content-length"]))
        data_obj = json.loads(str(data_byte, encoding="utf-8"))
        print("获取到的请求命令为:", data_obj)
        self.send_response(200)
        self.send_header('Content-Type', 'image/png')
        with open('./images/test.jpg', 'rb') as f:
            img_data = f.read()
            img_len = len(img_data)
            print('图像数据长度', img_len)
        self.send_header('Content-Length', img_len)  # os.path.getsize('Mario.png'))
        self.end_headers()
        self.wfile.write(img_data)
        self.wfile.flush()


    # get 命令集中处理
    def do_GET(self):
        if self.path == "/" or self.path == "/get":
            print("get 测试命令!")
            self.get_test()
        else:
            print("未知命令!", self.path)


    # post 命令集中处理
    def do_POST(self):
        if self.path == "/post":
            print("post 测试命令!")
            self.post_test()
        elif self.path == "/postfile":
            print("post 上传文件命令!")
            self.post_file()
        elif self.path == "/postparamfile":
            print("携带参数及图像数据的混合命令")
            self.post_picture_param()
        elif self.path == "/postbackfile":
            print("post 反馈图片命令!")
            self.post_back_file()
        else:
            print("未知命令!")


if __name__ == '__main__':
    server = HTTPServer(host, Resquest)
    print("Starting server, listen at: %s:%s" % host)
    server.serve_forever()

完整项目代码(需要投币2枚)

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值