Maison  >  Article  >  développement back-end  >  Explication détaillée de la demande de publication dans le développement de l'applet WeChat

Explication détaillée de la demande de publication dans le développement de l'applet WeChat

韦小宝
韦小宝original
2018-03-14 16:52:0314228parcourir

Cet article parle de la Demande de publication dans le développement de l'applet WeChat Si vous ne connaissez pas la demande de publication dans le développement de l'applet WeChat ou si vous êtes intéressé par la demande de publication dans le développement de. Applet WeChat, alors regardons cet article ensemble. Bon, sans plus tarder, entrons dans le vif du sujet !

1.demande de publication


wx.request(OBJECT)
wx.request
initiée est une requête HTTPS. Une applet WeChat ne peut avoir que 5 connexions de requête réseau en même temps.
Description officielle du site


ne peut pas être défini dans l'en-tête
参数名 类型 必填 说明
url String 开发者服务器接口地址
data Object、String 请求的参数
header Object 设置请求的 header , header 中不能设置 Referer
method String 默认为 GET,有效值:OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
success Function 收到开发者服务成功返回的回调函数,res = {data: '开发者服务器返回的内容'}
fail Function 接口调用失败的回调函数
complete Function 接口调用结束的回调函数(调用成功、失败都会执行)
Nom du paramètre
Type Obligatoire Description th >
url Chaîne Est Adresse de l'interface du serveur développeur
données Objet, Chaîne Non Paramètres demandés
en-tête Objet Non Définir le référent de la demande
method String. Non La valeur par défaut est GET, valeurs valides : OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
succès Fonction Non Reçu la fonction de rappel renvoyée avec succès par le service développeur, res = {data: 'Contenu renvoyé par le serveur développeur'}
échec Fonction Non Fonction de rappel en cas d'appel d'interface échoué
complète td> Fonction Non La fonction de rappel à la fin de l'appel d'interface (appel réussi, l'appel échoué sera exécuté)


Exemple d'applet WeChat

wx.request({
  url: 'test.php', //仅为示例,并非真实的接口地址
  data: {
        x: '' , 
        y: ''
   }, 
  header: { 
    'content-type': 'application/json' 
  }, 
  success: function(res) { 
    console.log(res.data) 
  }
})


Cette méthode de demande de GET est OK et l'en-tête n'a pas besoin d'être ajouté.
Mais POST a un gros problème.

J'utilise le code suivant pour le débogage (Code 1) :

wx.request({
    url: ApiHost + '/?service=default.getOrderInfo',
    data: {
      'order_id': order_id
    },
    method: 'POST',
    success: function (res) {
      // console.log(res);
      if (res.data.ret == 200) {
       //something to do
      }
      else{
       //something to do
      }
    }
    fail: function (res) {
      console.log(res);
    }
  });

Faites attention à l'image ci-dessous, l'invite dans l'outil de développement WeChat :

La requête POST mettra la valeur des données dans la charge utile de la requête au lieu des paramètres de la chaîne de requête. Si le serveur backend n'y prête pas attention, il ne le fera pas. pouvoir obtenir les données.
Il existe de nombreuses modifications sur Internet, comme celle-ci. ----Ajouter un en-tête

wx.request({
    url: ApiHost + '/?service=default.getOrderInfo',
    data: {
      //数据urlencode方式编码,变量间用&连接,再post
      'order_id='+order_id
    },
    method: 'POST',
    header:{
      'content-type':'application/x-www-form-urlencoded'
    },
    success: function (res) {
      // console.log(res);
      if (res.data.ret == 200) {
       //something to do
      }
      else{
       //something to do
      }
    }
    fail: function (res) {
      console.log(res);
    }
  });

Si vous le modifiez ainsi, le backend n'a pas besoin de traitement particulier.
Mais...

Parce que je souhaite toujours utiliser la méthode standard, le seul moyen est de modifier le serveur backend.
J'utilise ici le framework Phalapi, je le recommande~~~

if(DI()->request->getHeader('content-type'))
{    
  $contentType = DI()->request->getHeader('content-type');
}
if(!empty($contentType)&&(strtolower(@$contentType) === 'application/json'))
{
    $HTTP_RAW_POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : "{}";
    DI()->request = new PhalApi_Request(array_merge($_GET,json_decode($HTTP_RAW_POST_DATA, true)));
}

Enfin, j'ai réussi le débogage avec le Code 1 sur le PC. Utilisez des requêtes standards et n’utilisez pas le mode application/x-www-form-urlencoded.

Mais... quand j'utilise une vraie machine pour le débogage, pourquoi ne puis-je pas recevoir à nouveau le paramètre de requête. Des choses étranges. . . . . . . . .
Enfin, grâce à l'analyse de capture de paquets

Terminal de machine réelle

POST /?service=default.getOrderInfo HTTP/1.0
Host: proxy
Connection: close
Content-Length: 43
Content-Type: application/json
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_5 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13G36 
MicroMessenger/6.5.1 NetType/WIFI Language/zh_CN
Referer: https://servicewechat.com/###/0/page-frame.html
Accept-Language: zh-cn

{"order_id":"011T00wO0gZVR72P89tO0DFNvO0T00w0"}

Terminal de développement de simulation PC


POST /?service=default.getOrderInfo HTTP/1.0
Host: proxy
Connection: close
Content-Length: 43
Origin: http://###.appservice.open.weixin.qq.com
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 
appservice webview/100000
content-type: application/json
Accept: */*
Referer: https://servicewechat.com/####/devtools/page-frame.html
Accept-Encoding: gzip, deflate, br

{"order_id":"011T00wO0gZVR72P89tO0DFNvO0T00w0"}

Enfin trouvé la différence :
Content-Type et content-type
Simulateur La valeur par défaut est le type de contenu
La valeur par défaut pour les appareils réels est le type de contenu
Le serveur principal ajoute le traitement du type de contenu et c'est fait.

Ce qui précède représente tout le contenu de cet article. Si vous ne le comprenez pas bien, vous pouvez facilement maîtriser les deux côtés par vous-même !

Recommandations associées :
Explication détaillée du chargement déroulant et de l'actualisation pull-up de l'applet WeChat

L'applet WeChat implémente le partage de code d'image avec zoom doigt

PHP implémente le partage de code de paiement de l'applet WeChat

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn