声明
只是核心代码实现功能,细节及异常自己处理下.
代码
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()