微信开发post请求_微信公众号开发,为什么微信服务器发送的是post请求 - CSDN
  • 经过上一篇的讲解,我们已经知道如何响应用户发送的文本消息了,对于与微信公众号的互动这块,就是你发个用户什么,需要用户响应给你什么,这里记住关键一点就是数据的传输都是通过XML,只要正确解析微信请求中的XML...

    经过上一篇的讲解,我们已经知道如何响应用户发送的文本消息了,对于与微信公众号的互动这块,就是你发个用户什么,需要用户响应给你什么,这里记住关键一点就是数据的传输都是通过XML,只要正确解析微信请求中的XML数据包就能知道用户发送的是什么,然后只要你返回给微信服务器正确的XML数据,用户就能收到正确的响应。

    接下来要说的是,如何调用官方技术文档中的API去获得数据,这里讲主要的两种方式,也就是Get请求和Post请求。

    对于Get请求,我们已获取access_token为例,首先看官方技术文档

    接口调用请求说明

    https请求方式: GET
    https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

    参数说明

    参数 是否必须 说明
    grant_type 获取access_token填写client_credential
    appid 第三方用户唯一凭证
    secret 第三方用户唯一凭证密钥,即appsecret

    返回说明

    正常情况下,微信会返回下述JSON数据包给公众号:

    {"access_token":"ACCESS_TOKEN","expires_in":7200}

    参数说明

    参数 说明
    access_token 获取到的凭证
    expires_in 凭证有效时间,单位:秒

    那依据这个文档我们该如何在编码中通过get请求获取access_token 呢?首先需要获取到这个API接口,也就是这个URL

    String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";

    也就是一个字符串,现在这个字符串中可是缺少参数的,那么该怎么填充这些参数,这就牵涉都URL的拼接,那么该如何拼接呢?如下

    String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
    
            String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret);

    以上就是对URL的一个拼接。

    那么该如何发起请求获得数据呢?比如这个获取access_token的请求,当你成功发起请求,返回的数据是json,这就必然牵涉到对json数据的解析,我们需要将json数据解析成我们能用的数据,这里一般解析成Java对象。

    现在梳理一下,比如你编写代码发起一个get请求,然后成功得到返回的json数据,然后对json数据进行解析,得到我们想要的数据。

    http请求工具类

    现在有这么一个工具类

    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.ConnectException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONException;
    import com.alibaba.fastjson.JSONObject;
    import com.ithuanqging.wechat.bean.ExistLabelInfo;
    import com.ithuanqging.wechat.bean.NewLabel;
    import com.ithuanqging.wechat.bean.Token;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * 类名: HttpUtil </br>
     * 描述: 通用工具类 </br>
     */
    public class HttpUtil {
        private static Logger log = LoggerFactory.getLogger(HttpUtil.class);
        /**
         * 发送https请求
         *
         * @param requestUrl 请求地址
         * @param requestMethod 请求方式(GET、POST)
         * @param outputStr 提交的数据
         * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
         */
        public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
            JSONObject jsonObject = null;
            try {
                // 创建SSLContext对象,并使用我们指定的信任管理器初始化
                TrustManager[] tm = { new MyX509TrustManager() };
                SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
                sslContext.init(null, tm, new java.security.SecureRandom());
                // 从上述SSLContext对象中得到SSLSocketFactory对象
                SSLSocketFactory ssf = sslContext.getSocketFactory();
    
                URL url = new URL(requestUrl);
                HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
                conn.setSSLSocketFactory(ssf);
                conn.setDoOutput(true);
                conn.setDoInput(true);
                conn.setUseCaches(false);
                // 设置请求方式(GET/POST)
                conn.setRequestMethod(requestMethod);
                // 当outputStr不为null时向输出流写数据
                if (null != outputStr) {
                    OutputStream outputStream = conn.getOutputStream();
                    // 注意编码格式
                    outputStream.write(outputStr.getBytes("UTF-8"));
                    outputStream.close();
                }
                // 从输入流读取返回内容
                InputStream inputStream = conn.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                String str = null;
                StringBuffer buffer = new StringBuffer();
                while ((str = bufferedReader.readLine()) != null) {
                    buffer.append(str);
                }
                // 释放资源
                bufferedReader.close();
                inputStreamReader.close();
                inputStream.close();
                inputStream = null;
                conn.disconnect();
                //jsonObject = JSONObject.fromObject(buffer.toString());
                jsonObject = JSONObject.parseObject(buffer.toString());
            } catch (ConnectException ce) {
                log.error("连接超时:{}", ce);
            } catch (Exception e) {
                log.error("https请求异常:{}", e);
            }
            return jsonObject;
        }
    }

    这个工具类可以发送http请求,包括get和post两种方式,你只要传入正确的URL还有请求方式,如果是post请求添加正确的json数据,这个json数据也就是你post请求提交的数据,然后这个工具类就会将请求返回的json数据封装成一个JSONObject对象,然后你就可以通过JSONObject.get(key)的方式获取json对象的属性值了。

    比如这里的获取access_token

    发起Get请求获取数据

    /**
         * 获取接口访问凭证
         *
         * @param appid 凭证
         * @param appsecret 密钥
         * @return
         */
        public static Token getToken(String appid, String appsecret) {
            // 凭证获取(GET)
            String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
            Token token = null;
            String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
            // 发起GET请求获取凭证
            JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);
    
            if (null != jsonObject) {
                try {
                    token = new Token();
                    token.setAccessToken(jsonObject.getString("access_token"));
                    token.setExpiresIn(jsonObject.getInteger("expires_in"));
                } catch (JSONException e) {
                    token = null;
                    // 获取token失败
                    log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInteger("errcode"), jsonObject.getString("errmsg"));
                }
            }
            return token;
        }

    这段代码不难理解,首先拼接正确的URL,然后请求方式是get,所以第三个参数不用填,因为没有要提交的数据,所以发起请求就是这样

    JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);

    然后就返回给你一个JSONObject对象,就可以通过getkey的方式获取其中的属性值了。

    发起Post请求获取数据

    那么如果请求是Post的该怎样操作呢?相比于get请求就是在Post请求中需要添加提交的数据,而这个提交当然数据也是json数据,可以这样操作

     /**
         * 1、创建新的标签
         * @param labelname 只能创建一次,也就是标签唯一
         * @param token
         * @return
         */
        public static NewLabel creatNewLabel(String labelname, String token){
            NewLabel newLabel = null;
            // 拼接请求地址
            String requestUrl = "https://api.weixin.qq.com/cgi-bin/tags/create?access_token=ACCESS_TOKEN";
            requestUrl = requestUrl.replace("ACCESS_TOKEN", token);
            //提交的json数据
            String jsonData = "{\"tag\":{\"name\":\"%s\"}}";
            JSONObject jsonObject = HttpUtil.httpsRequest(requestUrl, "POST", String.format(jsonData,labelname));
    
            if (null != jsonObject){
                newLabel = new NewLabel();
                int id = jsonObject.getJSONObject("tag").getInteger("id");
                String name = jsonObject.getJSONObject("tag").getString("name");
                newLabel.setId(id);
                newLabel.setLabelname(name);
    
            }else if (0 != jsonObject.getInteger("errcode")){
                System.out.println("创建菜单失败 errcode:{} errmsg:{}"+jsonObject.getInteger("errcode")+jsonObject.getString("errmsg"));
            }
            return newLabel;
        }

    这个以微信公众号创建标签为例

    http请求方式:POST(请使用https协议)
    https://api.weixin.qq.com/cgi-bin/tags/create?access_token=ACCESS_TOKEN

    POST数据格式:JSON
    POST数据示例:

    {   "tag" : {     "name" : "广东"//标签名   } }

    参数说明

    参数 说明
    access_token 调用接口凭据
    name 标签名(30个字符以内)

    返回说明(正常时返回的json数据包示例)

    {   "tag":{ "id":134,//标签id "name":"广东"   } }

    这里已经给出了提交json数据的示例,那么除了拼接正确的URL,因为是Post请求还要添加请求数据,就是这样发起请求了

    //提交的json数据
            String jsonData = "{\"tag\":{\"name\":\"%s\"}}";
            JSONObject jsonObject = HttpUtil.httpsRequest(requestUrl, "POST", String.format(jsonData,labelname));

    这里主要就是对提交的json数据做处理,工具类的第三个参数就是填写提交的json数据,只不过需要填写我们要提交的数据,比如这里的json数据是这样

    //提交的json数据
            String jsonData = "{\"tag\":{\"name\":\"%s\"}}";

    其实这里的%s就可以直接换成我们想要创建的标签的名字,然后直接将jsonData作为第三个参数传入,只不过这里使用到了

    String.format(jsonData,labelname)

    相比你也知道这样处理的作用及目的,详细的用法可以搜索String.format的用法即可!

    以上就是给你一个API接口,我们该怎么调用获取数据的说明了,当然,针对的数据格式是json,这在实际的开发中用到的非常多,所以一定要熟悉!

    展开全文
  • 微信小程序开发之网络请求(POST请求)

    万次阅读 热门讨论 2016-12-12 12:36:37
    微信小程序开发中网络请求必不可少.GET.POST请求是最常用的.GET请求 POST请求的时候有好几个坑.我已经为大家填好了. wx.request({ url: 'test.php', data: { x: '' , y: '' }, method: "POST", header: { '...

    CSDN微信小程序开发专栏,欢迎关注!

    微信小程序开发中网络请求必不可少.GET.POST请求是最常用的.GET请求

    POST请求的时候有好几个坑.我已经为大家填好了.

    <img src="https://img-blog.csdn.net/20161017170933243?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" align="middle" alt="" />
    
    按照文档,肯定是这么写.那就入坑了.

    1. 'Content-Type': 'application/json'用在get请求中没问题.

    POST请求就不好使了.需要改成: "Content-Type": "application/x-www-form-urlencoded"


    2016.11.10更新:有同学在将content-type 修改为小写后,post请求成功.

    2. 加上method: "POST"

    3.data: { cityname: "上海", key: "1430ec127e097e1113259c5e1be1ba70" }写成json格式这样也是请求不到数据的.需要转格式.

    下面直接贴代码:

     3.1

    <span style="font-size:24px;">//index.js
    //获取应用实例
    var app = getApp()
    Page( {
      data: {
        toastHidden: true,
        city_name: '',
      },
      onLoad: function() {
        that = this;
        wx.request( {
          url: "http://op.juhe.cn/onebox/weather/query",
          header: {
            "Content-Type": "application/x-www-form-urlencoded"
          },
          method: "POST",
         //data: { cityname: "上海", key: "1430ec127e097e1113259c5e1be1ba70" },
          data: Util.json2Form( { cityname: "上海", key: "1430ec127e097e1113259c5e1be1ba70" }),
          complete: function( res ) {
            that.setData( {
              toastHidden: false,
              toastText: res.data.reason,
              city_name: res.data.result.data.realtime.city_name,
              date: res.data.result.data.realtime.date,
              info: res.data.result.data.realtime.weather.info,
            });
            if( res == null || res.data == null ) {
              console.error( '网络请求失败' );
              return;
            }
          }
        })
      },
      onToastChanged: function() {
        that.setData( { toastHidden: true });
      }
    })
    var that;
    var Util = require( '../../utils/util.js' );</span>

    3.2

    <span style="font-size:24px;"><!--index.wxml-->
    <view class="container">
       <toast hidden="{{toastHidden}}" bindchange="onToastChanged">
            {{toastText}}
        </toast>
        <view>{{city_name}}</view>
        <view>{{date}}</view>
        <view>{{info}}</view>
    </view></span>
    3.3

    <span style="font-size:24px;">//util.js
    function json2Form(json) {
        var str = [];
        for(var p in json){
            str.push(encodeURIComponent(p) + "=" + encodeURIComponent(json[p]));
        }
        return str.join("&");
    }
    module.exports = {
      json2Form:json2Form,
    }</span>



    希望对大家有帮助.


    http://blog.csdn.net/qq_31383345






    展开全文
  • 微信小程序开发之大坑记之post请求

    万次阅读 热门讨论 2017-01-08 23:04:52
    小程序利用Springmvc ...微信小程序开发之大坑记之post请求   在微信小程序开发过程中,如果你完全按照官方文档来,那么恭喜你,90%的可能性你会掉入大坑而且还难以爬起来,有时候明显没有任何问题但是结果就是不对


     

    在微信小程序开发过程中,如果你完全按照官方文档来,那么恭喜你,90%的可能性你会掉入大坑而且还难以爬起来,有时候明显没有任何问题但是结果就是不对。

    今天就来给大家说一下客户端发起post请求时的一个坑。

     

    按照官方文档,我们客户端发起post请求的代码如下:

      t:function() {

      wx.request({

        url: 'https://www.meimichao.com/bee/uploadHandler',

        data: {"city":"123"

       },

        method: 'POST', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT

       //header: {"Content-Type":"application/x-www-form-urlencoded"}, // 设置请求的 header

        success: function(res){

        console.log(JSON.stringify(res));

        },

        fail: function(res) {

         console.log(JSON.stringify(res));

        },

        complete: function() {

          // complete

        }

       })

      },

     

    但是你这么写,无论如何在服务器端都是获取不到参数city的值的,始终会报null。这时你只要将post请求改成get请求类型,马上就可以获取到city参数的值了,

    客户端改成:

      t:function() {

      wx.request({

        url: 'https://www.meimichao.com/bee/uploadHandler',

        data: {"city":"123"

       },

        method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT

       //header: {"Content-Type":"application/x-www-form-urlencoded"}, // 设置请求的 header

        success: function(res){

        console.log(JSON.stringify(res));

        },

        fail: function(res) {

         console.log(JSON.stringify(res));

        },

        complete: function() {

          // complete

        }

       })

      },

     

    服务器端:

     

     

    非常奇怪的是,我们只要在post请求中加上下面这个请求头,服务器端马上就可以获取到city参数的值了。

    header: {"Content-Type":"application/x-www-form-urlencoded"},

     

    对此官方文档是没有任何说明的,只有在你跌入坑了以后你才知道。

     

     

    展开全文
  • 微信小程序以post方式提交

    万次阅读 多人点赞 2018-05-11 10:35:17
    微信小程序开发中网络请求必不可少.GET .POST请求是最常用的.GET请求,POST请求的时候有好几个坑.我已经为大家填好了. 之前的.GET 请求都是如下这样写:(给大家举个例子)wx.request({ url: url, data: { ...
            微信小程序开发中网络请求必不可少.GET .POST请求是最常用的.GET请求,POST请求的时候有好几个坑.我已经为大家填好了.

            之前的.GET 请求都是如下这样写:(给大家举个例子)

    wx.request({
          url: url,
          data: {
            teacherid: teacherid
          },
          header: {
            'content-type': 'application/json'
          },
          success: (res) => {
            // console.log(res.data);
            this.setData({
              testpaper: res.data.testpaper,
              teacher : res.data.teacher
            });
          }
        })
    但是post方式提交的话就有所改变了,给大家列出以下几点注意事项:

    1.  'Content-Type': 'application/json'用在get请求中没问题.

    POST请求就不好使了.需要改成 :  "Content-Type": "application/x-www-form-urlencoded"

    2. 加上 method: "POST"

    3. data: { answer : { "a":10,"b":8,"c":6 } } 写成json格式这样也是请求不到数据的.需要转格式.

    这里我用JSON.Stringify() 将json对象转换成json字符串格式

    部分代码分享给大家,这里answer与student 都是json对象格式需要转换

    wx.request({
          url : "https://www.",
          method: "POST",
          data: {
            answer : JSON.stringify(this.data.answer),
            score : _score,
            pjid : this.data.pj.pjid,
            testpaperid : this.data.pj.testpaperid,
            student : JSON.stringify(this.data.student),
            message : this.data.message
          },
          header: {
            "Content-Type": "application/x-www-form-urlencoded"
          },
          success: function (res) {
            console.log(res.data);
            wx.navigateBack({
              delta: 1  //小程序关闭当前页面返回上一页面
            })
            wx.showToast({
              title: '评教成功!',
              icon: 'success',
              duration: 2000
            })
          },
        })

    如有问题,欢迎留言,与大家共同探讨与学习!!!


    展开全文
  • 1、关闭csrf 2、重写beforeAction() 这个csrf最好还是不要关闭//当前控制器执行action方法之前要执行的方法 public function beforeAction($action) { if ($action->id == 'yiilib-method') { ...
  • public static Map<String,Object> getResJson(String postUrl,String reqJson) throws UnsupportedEncodingException{ //发送请求 HttpClient client =new DefaultHttpClient()...
  • 微信公众号开发 POST请求错误

    千次阅读 2016-08-18 08:56:40
    接触微信公众号接口开发,在进行自行以菜单添加进行POST请求时 出错 无任何返回结果。 用的是curl的请求。最后差错时因为curl的原因 对比代码如下:错误版 无法放问POST 返回错误结果代码为60 对应错误是:无法使用...
  • yii2.0集成微信开发,网站与微信对接失败情况------csrf安全验证  yii说实话,在安全上确实很牛逼,但是,有时候就是这个高安全性,害死一大波phper,我就是其中的一个。 1.下面是我在YII里的控制器,...
  • 微信公众号get与post请求实现模版

    千次阅读 2017-11-28 10:35:42
    在做微信公众平台后台开发的时候,常常需要用代码实现模拟浏览器的GET和POST请求, 下面是用Java语言实现的GET和POST请求的一般写法:1.GET请求模拟(不带参数) //由于这类方法经常被用到,因此建议写在一个工具类...
  • 跨域名访问get and post 方法,在微信企业公众号开发中用到的
  • 微信开发(二)http请求工具类

    千次阅读 2018-05-20 22:28:08
    进行微信开发,后台程序需要与微信服务器进行交互,通过调用接口来完成服务,阅读微信开发文档,发现接口的调用都是通过http请求进行的,所以必须有个HttpUtil来支撑,这里总结下以javaAPI的方式和以Apach的...
  • java开发微信小程序post请求与get请求

    千次阅读 2018-05-12 09:26:17
    问题:用post请求方式时,后端接受不到前端传回的数据,而用get方式可以。原因:微信小程序api,默认使用的get方式。前端代码按照文档,肯定是这么写.那就入坑了.header头中: 'Content-Type': 'application/json'用...
  • 对于 get请求 无所谓 ,但是到了 post请求 各种问题 层出不穷。参数接收不到值。两种方式解决 一 在 参数上添加 requestbody注解 还有一种 是 修改请求头 wx.request( { url: "xxxxx", header: { "Content-Type...
  • 不得不说,开发环境下,微信小程序要是在发起网络请求的话,遇到的坑也是有的。尽管,微信提供了十分便捷的API 供开发者调用。今天在小程序中写了一个表单,需要提交到服务器上,于是发起了一个 POST 请求,结果报错...
  • 微信开发少不了要用到post跟get请求,封装一个函数方便后期使用 function curl_request($url, $data=null, $method='get', $https=true){ $ch = curl_init();//初始化 curl_setopt($ch, CURLOPT_URL, $url);//...
  • 微信开发 POST接收不到数据

    千次阅读 2014-07-18 10:00:02
    微信公众平台上自定义菜单的事件推送,文档上说会POST这些个数据 xml> ToUserName>ToUserName> FromUserName>FromUserName> CreateTime>123456789CreateTime> MsgType>MsgType> Event>Event> EventKey>EventKey> ...
  • 微信小程序 post请求总是不成功

    千次阅读 2018-12-07 13:33:48
    网上各种搜索,各种置换参数,皆不行,原来是自带的微信开发工具的bug:     红框处一定要勾选,否则有些请求会失败!!!   附post请求源码:   wx.request({ url: "http://client", header: { &...
  • 微信小程序开发之网络请求(GET请求)

    万次阅读 2016-10-17 16:22:06
    微信小程序开发中网络请求必不可少,今天说说最简单的请求.后续会尝试上传下载,Socket这些. 1.一个微信小程序,同时只能有5个网络请求连接。 这个规定应该是微信为了保证用户体验制定的,毕竟是小程序. 2.wx.request...
  • 直接贴代码 package com.website.commons.web.utils; import java.io.IOException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache....import org.apache
  • 微信小程序 post 请求404

    万次阅读 2018-07-31 09:17:06
    微信小程序 错误: 后台使用springmvc注解 wx.request请求,url正确,能够将数据传递到后台,后台能够正确处理返回值,但是小程序端却提示 post请求的url) not found 404   原因: 请求函数没有加上@...
1 2 3 4 5 ... 20
收藏数 26,815
精华内容 10,726
关键字:

微信开发post请求