C#客户端与Django服务器端对接——HTTP协议之POST&GET

这段时间一直在搞C#客户端与Django搭建的服务器端对接的工作。

从最开始的不知道怎么用Django写服务器端来处理POST请求,到现在能让服务器端接受POST或GET请求并打印出来。虽然客户端还没有登录成功(因为response还没有写好),不过已经取得了部分成果。

任务分析:C#客户端有一个登录界面和一个登录后的界面,用户需要在登录界面输入用户名和密码才能登录成功,而输入用户名和密码后,单击“登录”按钮,触发相应事件,客户端会向以本机作为服务器的某个地址POST用户名和密码,而在客户端单击“登录”按钮之前,需要先启动用django在本机上搭建的本地服务器,当服务器收到客户端的POST请求后,服务器端需接收POST过来的用户名和密码并和django关联的数据库后台进行验证,验证成功后response一个正确的值给客户端,客户端此时才能跳转到另一个界面。

编译环境:win10专业版 + VS2013 + Python3.5 + Django1.8框架

首先贴上客户端用GET方式请求的代码:

public string GET(string url)
        {
            req = (HttpWebRequest)WebRequest.Create(new Uri(url));
            req.AllowAutoRedirect = true;
            req.CookieContainer = Token;
            req.Method = "GET";
            req.Timeout = 10000;
            req.ContentType = "application/json; charset=utf-8";

            try
            {
                //工厂方法
                //New Response
                HttpWebResponse response = (HttpWebResponse)req.GetResponse();
                //Set Cookie
                string setCookie = response.Headers.Get("Set-Cookie");
                //检查Response中是否含有Set-Cookie
                if (!string.IsNullOrWhiteSpace(setCookie))
                {
                    Token = new CookieContainer();
                    string[] kvp = setCookie.Split(new char[] { ‘=‘, ‘;‘ });
                    Cookie cookie = new Cookie(kvp[0], kvp[1]);
                    cookie.Domain = req.Host.Split(‘:‘)[0];
                    Token.Add(cookie);
                }

                if (response.StatusCode == HttpStatusCode.Found)
                {
                    response.Close();
                    return this.GET(response.Headers["Location"]);
                }

                //Get Response Stream
                StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                res = sr.ReadToEnd();
                sr.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            return res;
        }
private static HttpResqust httpReq=new HttpResqust();

        private static string Operator(string url)
        {
            var res = httpReq.GET(url);
            return res;
        }
string postData = "username=" + username + "&" + "password=" + password;
 string opData = Operator(loginAPI + "?" + postData);          //其中LoginAPI指向 ”http://localhost:8080/login/“
            Log(opData);
            try
            {
                op = JsonHelper.ParseFromJson<Operator>(opData);
            }
            catch
            {
                op = null;
                return "Login error";
            }
            return "OK";   

服务器端django代码:

在项目的app\views.py中自定义一个客户端登录的方法:

def client_login(request):      #自定义一个方法,方法名字不要写成login,因为django有login模块

    if request.method==‘GET‘:                   #用GET方法来获取从HTML传递过来的表单内容
        username=request.GET.get(‘username‘,‘‘)    #获取C#客户端GET过来的用户名和密码
        password=request.GET.get(‘password‘,‘‘)
        print(username,password)
    else:
        print("come on")   #测试

接着在app\urls.py中添加url的地址:

urlpatterns = [

               url(r‘^login/$‘, views.client_login,name=‘client_login‘),

]

其中正则表达式 r‘^login/$‘ 对应”http://localhost:8080/login/“ ;

同时在  系统文件\settings.py中配置相关代码:

INSTALLED_APPS = (
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    ‘app‘,    #添加应用名字
)

ROOT_URLCONF = ‘app.urls‘   

以上,服务器端的代码已完成,接着在项目文件夹下打开命令行窗口,执行 python manage.py runserver 8080 ,此时已经在8080端口启动服务器。

接着单击客户端登录界面的”登录“按钮,python的命令行窗口就能打印出用户名和密码了,表明服务器端已经能接收客户端的GET请求了。

Another——>再贴上客户端用POST方式请求的代码:

public string POST(string url, string postData)
        {
            req = (HttpWebRequest)WebRequest.Create(new Uri(url));
            req.AllowAutoRedirect = true;
            req.CookieContainer = Token;
            req.Method = "POST";
            req.Timeout = 10000;
            req.ContentType = "application/x-www-form-urlencoded; charset=utf-8";

            try
            {
                //通过表单的形式提交参数
                //Convert Data
                byte[] data = Encoding.UTF8.GetBytes(postData);
                req.ContentLength = data.Length;
                //写入数据流
                //Send Data
                Stream stream = req.GetRequestStream();
                stream.Write(data, 0, data.Length);
                stream.Close();
                //工厂方法
                //New Response
                HttpWebResponse response = (HttpWebResponse)req.GetResponse();

                string setCookie = response.Headers.Get("Set-Cookie");
                //检查Response中是否含有Set-Cookie
                if (!string.IsNullOrWhiteSpace(setCookie))
                {
                    Token = new CookieContainer();
                    string[] kvp = setCookie.Split(new char[] { ‘=‘, ‘;‘ });
                    Cookie cookie = new Cookie(kvp[0], kvp[1]);
                    cookie.Domain = req.Host.Split(‘:‘)[0];
                    Token.Add(cookie);
                }

                if (response.StatusCode == HttpStatusCode.Found)
                {
                    response.Close();
                    if (response.Headers["Location"].Contains("login"))
                        if (ReloginNotify != null)
                            ReloginNotify();
                    return this.GET(response.Headers["Location"]);
                }
                //Set Cookie
                //Get Response Stream
                StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                res = sr.ReadToEnd();
                sr.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                return ex.Message;
            }

            return res;
        }
     string postData = "username=" + username + "&" + "password=" + password;
         var res = httpReq.POST(loginAPI, postData);          //其中LoginAPI指向 ”http://localhost:8080/login/

        Log(res); 
        try      {        op = JsonHelper.ParseFromJson<Operator>(res);      } 

        catch      {        op = null; return "Login error";      } 

     return "OK";

客户端改用POST方式请求后,此时需要更改服务器端的部分代码,其他配置保持不变,只需更改处理客户端请求的方法即可:

def client_login(request):      #自定义一个方法,方法名字不要写成login,因为django有login模块

    if request.method==‘POST‘:
        username=request.POST.get(‘username‘,‘‘)    #获取C#客户端POST过来的用户名和密码
        password=request.POST.get(‘password‘,‘‘)
        print(username,password)
    else:
        print("come on")   #测试

此时客户端的POST请求和服务器端的处理客户端的代码已经更新。

可当我执行 python manage.py runserver 8080 后,客户端单击”登录“按钮,在python的命令行窗口始终输出 POST 403 错误,而且在django的各个位置打印数据,发现POST请求始终无法连 def client_login(request) 这个方法都进不去,然后我反复检查C#的POST代码,一直找不出bug在哪儿。。。

直到今晚在师兄几句话的指点下,让我检查一下django在处理POST请求的时候是不是需要配置哪些参数,或者django是不是限制了POST的请求等等。

终于在一篇技术博客找到了相应的解决方法,贴上地址:http://blog.csdn.net/yisuowushinian/article/details/46137511

命令行窗口出现 403 错误是 因为django默认的配置MIDDLEWARE_CLASSES中一个中间件CSRF(跨站请求伪造)对POST请求做了验证,

在 项目文件/setting.py 中,找到如下配置,

MIDDLEWARE_CLASSES = (
    ‘django.contrib.sessions.middleware.SessionMiddleware‘,
    ‘django.middleware.common.CommonMiddleware‘,
    #‘django.middleware.csrf.CsrfViewMiddleware‘,           #拒绝POST请求的罪魁祸首
   # ‘django.middleware.csrf.CsrfResponseMiddleware‘,             #已注释
    ‘django.contrib.auth.middleware.AuthenticationMiddleware‘,
    ‘django.contrib.auth.middleware.SessionAuthenticationMiddleware‘,
    ‘django.contrib.messages.middleware.MessageMiddleware‘,
    ‘django.middleware.clickjacking.XFrameOptionsMiddleware‘,
    ‘django.middleware.security.SecurityMiddleware‘,
)

将图中代码注释掉即可,此时再执行 python manage.py runserver 8080 ,点击”登录“按钮,就能在服务器端的命令行窗口打印用户名和密码了。

效果如下:

客户端:

服务器端python的命令行窗口:

至此,已完成服务器端接收客户端POST或GET请求的数据了,还差对response做处理,所以仍未登录成功。继续努力!

时间: 2025-01-20 01:32:47

C#客户端与Django服务器端对接——HTTP协议之POST&GET的相关文章

浅析Java web程序之客户端和应用服务器端交互原理

最近一直在思考一个问题,为什么在用struts框架开发的时候FormBean都需要序列化,即实现java.io.Serializable接口,本着勤学好问的精神我Google了下对象序列化方面的文章,虽然大体了解了怎么做,但是还是没有搞清楚为什么要这样做:最后我想解决一个问题要找问题的根源和本质,于是从web程序客户端和服务器端交互的原理入手,终于找到了我要的答案. 1. 对象序列化是什么东东? 简单地说,Java对象列化就是要把内存中的Java对象保存下来(持久化),以便可以在网络上传输或今后

腾讯QQ的开发分客户端软件和服务器端软件

Windows客户端主要是C++ COM/ATL Q+Web 后端C++ CGI ,前端javascript和flash 望采纳 腾讯QQ使用何种开发平台? 腾讯QQ的开发分客户端软件和服务器端软件两部分. 客户端采用 Microsoft Visual C++开发: 服务器端软件采用Linux gcc开发 : 数据库采用MySql 数据库. 腾讯QQ采用标准的TCP/IP协议为通信协议. TCP/IP协议中又分为TCP协议和UDP协议,TCP协议是面向连接的协议,它比较安全.稳定,但是效率不高,

android 客户端支付宝 php服务器端编写

生成私钥 输入"genrsa -out rsa_private_key.pem 1024"命令,回车后,在当前 bin 文件目 录中会新增一个 rsa_private_key.pem 文件,其文件为原始的商户私钥(请妥善保 存该文件,PHP 开发语言中需要使用该文件), 生成公钥 输入"rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem"命令回车 后,在当前 bin 文件目录中会新增一个 rsa_p

表单的验证:客户端验证和服务器端验证

表单的验证:客户端验证和服务器端验证 表单的确认 客户端确认: 减少服务器负载 缩短用户等待时间 兼容性难 服务器端确认: 统一确认 兼容性强 服务器负载重 客户端验证例子 首先建立一个表单,在其提交时用JavaScript方法进行验证,若该方法返回true,则进行表单的提交,若返回false,则表单不提交. <!-- 表单提交时执行JavaScript方法validate(),如果该方法返回false,那么表单是不会提交的 --> <form onsubmit="return

多个客户端与一个服务器端通信的问题

多个客户端与一个服务器端通信的问题 上篇博文主要是讲的关于客户端与服务器端的通信问题,在上篇博文中当我们只有一个客户端访问我们的服务器时是可以正常运行的,但是当我们有多个客户端访问我们的服务器时,我们的代码就不能正常工作了. 而在现实中,我们是很少有一个服务器只供一个客户端访问的,此篇博文就是来解决多个客户端访问我们服务器端的问题. 解决方法: 用一个多线程就可以解决 实现代码如下: 第一个:客户端的代码如下: package org.wrh.socketserver; import java.

公众号和app和web都是客户端,都可以对接一个后台

1.公众号和app和web都是客户端,都可以对接一个后台 2.域名中包含端口号吗?:不包括,不包括 3.目前在IIS服务器上搭建了一个网站,域名也申请了,可是80端口不能使用,可以使用8000,每次访问网站都要输入xxx.xxx.xxx:8000,能不能通过什么方法直接输入域名然后转到8000端口上

一个客户端和一个服务器端聊天

*发送线程 import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner; public class SendThread extends Thread { private Socket socket; public SendThread(Socket socket){ this.socket = socket; } @Override publi

pycharm上运行django服务器端、ip地址访问

安装Django  下载Django包,解压缩. CMD 进入解压路径下. 执行:python setup.py install 增加环境变量: C:\Python27\Scripts 测试django是否安装成功 shell import django django.VERSION 把Django导入项目 CMD 进入项目路径 执行 django-admin.py startproject 项目名  运行开发服务器 项目Django路径下  python manage.py runserver

pycharm上运行django服务器端、以及创建app方法

安装Django  下载Django包,解压缩. CMD 进入解压路径下. 执行:python setup.py install 增加环境变量: C:\Python27\Scripts 测试django是否安装成功 shell import django django.VERSION 把Django导入项目 CMD 进入项目路径 执行 django-admin.py startproject 项目名  运行开发服务器 项目Django路径下  python manage.py runserver