인터페이스 호출 종료 시 콜백 함수(호출 성공 또는 실패 시 실행) |
|
WeChat 미니 프로그램 예시
wx.request({
url: 'test.php', //仅为示例,并非真实的接口地址
data: {
x: '' ,
y: ''
},
header: {
'content-type': 'application/json'
},
success: function(res) {
console.log(res.data)
}
})
이 요청은 GET 방식이면 괜찮고, 헤더를 추가할 필요가 없습니다.
하지만 POST에는 더 큰 문제가 있습니다.
디버깅을 위해 다음 코드를 사용합니다(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);
}
});
아래 그림에 주의하세요. WeChat 개발 도구의 프롬프트는 다음과 같습니다.
POST 요청은 데이터 값을 쿼리 문자열 매개변수 대신 요청 페이로드를 사용하면 백엔드 서버가 주의를 기울이지 않으면 데이터를 가져올 수 없습니다.
인터넷에는 이런 개혁 방법이 많이 있습니다. ----헤더 추가
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);
}
});
이렇게 수정하면 백엔드에서는 특별한 처리가 필요하지 않습니다.
하지만...
아직도 표준 방식을 사용하고 싶기 때문에 백엔드 서버를 수정하는 방법 밖에 없습니다.
여기서는 Phalapi 프레임워크를 사용하고 있는데 추천드려요~~
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)));
}
드디어 PC에서 Code 1을 이용하여 디버깅을 통과했습니다. 표준 요청을 사용하고 application/x-www-form-urlencoded 모드를 사용하지 마십시오.
그런데...실제 머신을 사용하여 디버깅할 때 왜 요청 매개변수를 다시 받을 수 없나요? 이상한 것들. . . . . . . . .
마지막으로 패킷 캡처 및 분석을 통해
실제 머신 측
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"}
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"}
드디어 차이점을 찾았습니다:
Content-Type과 content-type
에뮬레이터 기본값은 content-type
실제 머신의 기본값은 Content-Type
백엔드 서버에서 Content-Type 처리를 추가하면 완료됩니다.
위 내용이 이 글의 전부입니다. 잘 모르신다면 혼자서도 쉽게 두 가지를 마스터하실 수 있습니다!
관련 권장 사항:
풀다운 로딩 및 풀업 새로 고침을 구현하는 WeChat 애플릿에 대한 자세한 설명
핑거 줌 사진 코드 공유를 구현하는 WeChat 애플릿
WeChat 애플릿 결제를 구현하는 PHP 코드 공유