07月13, 2016

post/get请求小结(嗯,就是上一篇文章的小结)

问题

使用casperjs发送post请求时,一直无法正确请求。 问题原因:

  1. 传递data格式有误。
  2. 传递data格式无误时,没有加添加Content-Type参数。
  3. 之前关于提交表单有个误区,以为若action中包含参数,并且input中需要传递参数,两者不能同时存在- -.(底部验证中有解疑)

所以,post请求传递的data内容若需要为Json格式,但是若发送的不是单纯的key+value形式,那么需要添加Content-Type参数。以下是正确请求的代码。

casper.thenOpen("http://westpsk.com/api/v2?token=***token***=page&operation=update&ids=3701347013",{
    method: "POST",
    data : {
            "data" : {
                "description": "description test",
                "codes": "<html>test codes</html>"
            },
            "control" : {
                "lock" : 1,
                "version" : 0
            },
            "ext" : {
            }
        },
    headers: {
        "Accept":"application/json",
        "Content-Type":"application/json"
    }
},function(response){
    if(response.status == 200){
        this.echo("update success");
        var json_string = JSON.parse(this.page.plainText);
        // this.echo(json_string.data.codes);
        require("utils").dump(this.page.content);
    }
});

关键点

  1. 请求url中带有参数,并且需要传递body数据。
  2. 传递的数据不是单纯的key+value的json格式,需要设置'Content-Type':'application/json',否则无法正常传递。

疑惑点

现象

发送form表单时候会出现请求参数带不进去的情况。

  • method为get时,q=11不能传过去,input里的表单数据可以取到。
  • method为post,q=11可以传过去,但是input里的表单数据就取不到了。
<form action="http://so.com?q=11" method="get" target="_blank">
    <input name="tab" value="batch">
    <input name="sina-fr" type="hidden" value="bd">
</form>

对于get方式,服务器端用Request.QueryString获取变量的值,浏览器会将表单数据封装为字符串,如name=Google&age=18&qq=123456,然后直接附在表单的 action URL 之后。这两者之间用问号(?)进行分隔。如果GET请求的表单action属性中已经包含参数,浏览器会直接将其过滤掉,再附加form表单数据。

对于post方式,服务器端用Request.Form获取提交的数据,会把发送的数据放置在http包中,form的action属性就是提交数据的url地址。所以它会按照action指定的url进行提交数据,包含url后面跟着的参数和参数值。

因此,GET请求方式的表单的action属性中不能附带任何参数,如果需要附加额外的参数,可以采用如下方式:

  1. 采用POST请求方式,在form中增加属性method="post"即可。
  2. 如果仍然想使用GET请求方式,可以在form表单中添加相应的隐藏文本域,例如:

<input name="method" type="hidden" value="queryUser">

验证:

1.get请求

<div class='form'>
    <form action="post?a=1" method="get" target="_blank">
        <input type="text" name="name" value="ivan">
        <input type="text" name="pwd" value="fe">
        <button class="sub_btn">查询</button>
    </form>
</div>
async postAction(){
    let name = this.get("name");
    let pwd = this.get("pwd");
    this.assign({
        name: name,
        pwd: pwd
    });
    return this.display();
}

结果:

即:get请求时,action中a=1这个参数被丢弃掉了,可以得到input的内容。

2.post请求

<div class='form'>
    <form action="post?a=1" method="post" target="_blank">
        <input type="text" name="name" value="ivan">
        <input type="text" name="pwd" value="fe">
        <button class="sub_btn">查询</button>
    </form>
</div>
async postAction(){
    let name = this.post("name");
    let pwd = this.post("pwd");
    this.assign({
        name: name,
        pwd: pwd
    });
    return this.display();
}

结果:

即:post请求时,action中a=1这个参数可以取到,input的内容也可以获取到。

3.前端使用post请求,后端处理时使用get请求

<div class='form'>
    <form action="post?a=1" method="post" target="_blank">
        <input type="text" name="name" value="ivan">
        <input type="text" name="pwd" value="fe">
        <button class="sub_btn">查询</button>
    </form>
</div>
async postAction(){
    let name = this.get("name");
    let pwd = this.get("pwd");
    this.assign({
        name: name,
        pwd: pwd
    });
    return this.display();
}

即:前端使用post请求,而服务端使用get请求的方式是获取不到input中的内容的,只能拿到action里面的url的内容。(疑问解决)

总结

  1. 通过form表单提交和直接使用nodejs提交性质一样。 所以通过post请求,可以获取到url和data参数,之前之所以获取不到,是因为前后端处理不一致导致的。
  2. 通过post请求的话,若传递的数据格式不是单纯的key+value的形式,那么最好加入'Content-Type': 'application/json'

本文链接:http://westpsk.com/post/a-post-get-sum.html

-- EOF --

Comments