- 浏览: 1095279 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (290)
- php (65)
- javascript (36)
- html5 (31)
- thinkphp (9)
- mysql (16)
- jquery (13)
- node.js (9)
- css (9)
- android 开发 (8)
- flex (5)
- java (3)
- apache (8)
- linux (8)
- git (5)
- web (5)
- wordpress (9)
- mongodb (2)
- redis (5)
- yaf (6)
- python (4)
- big data (1)
- sphinx (1)
- html (1)
- bootstrap (1)
- vue (1)
- laravel (1)
- test (0)
最新评论
-
July01:
推荐用StratoIO打印控件,支持网页、URL、图片、PD、 ...
如何解决非IE浏览器的web打印 -
flashbehappy:
同一个视频,有mp4,ogg两种格式的。在chrome,fir ...
firefox chrom safari 对video标签的区别 -
xmdxzyf:
可以在网站(www.sosoapi.com)上试下在线表单方式 ...
用swagger-php/ui做API测试 -
flex_莫冲:
a2631500 写道"看了源码,设置Backbon ...
backbone与php交互 -
a2631500:
"看了源码,设置Backbone.emulateJS ...
backbone与php交互
node使用了express4和body-parser来解析php curl的数据,但是获取的req.body是{},设置了header
前提知识:
body-parser不支持解析multi/form-data的功能,如果是传递二进制数据或者文件上传,就不能用它了。
Node.js body parsing middleware.
This does not handle multipart bodies, due to their complex and typically large nature. For multipart bodies, you may be interested in the following modules:
busboy and connect-busboy
multiparty and connect-multiparty
formidable
multer
This module provides the following parsers:
JSON body parser
Raw body parser
Text body parser
URL-encoded form body parser
参考:
https://github.com/expressjs/body-parser#bodyparserurlencodedoptions
PHP 代码
node 代码
指定了解析方式依然不行。就到body-parser的源码中一行行调试下去。
找到urlencode.js
这行shouldParse 返回false
再到type-is.js/index.js 返回false。
var value = req.headers['content-type']
发现这里的req.headers['content-type'] 是 multipart/form-data,而type是application/x-www-form-urlencoded
原来,在php执行curl的时候,postData是数组,会将数据编码设置为 multipart/form-data
修改pHP代码
参考:
http://php.net/manual/zh/function.curl-setopt.php
前提知识:
body-parser不支持解析multi/form-data的功能,如果是传递二进制数据或者文件上传,就不能用它了。
Node.js body parsing middleware.
This does not handle multipart bodies, due to their complex and typically large nature. For multipart bodies, you may be interested in the following modules:
busboy and connect-busboy
multiparty and connect-multiparty
formidable
multer
This module provides the following parsers:
JSON body parser
Raw body parser
Text body parser
URL-encoded form body parser
参考:
https://github.com/expressjs/body-parser#bodyparserurlencodedoptions
PHP 代码
function addCurl($url, $type="get", $postData=null) { $ch = curl_init(); $headers[] = 'Connection: Keep-Alive'; $headres[] = 'Content-Type: application/x-www-form-urlencoded;charset=utf-8'; $headers[] = 'Content-Length: ' . strlen(json_encode($postData)); //$headres[] = 'Content-Type: application/json'; //$headres[] = 'Content-Type: text/html'; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if ($type=="get") { curl_setopt($ch, CURLOPT_POST, 0); } else { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, urlencode(json_encode($postData))); } curl_setopt($ch, CURLOPT_URL, $url); $data = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if (curl_errno($ch)) { echo 'Curl error: ' . curl_error($ch) . PHP_EOL; curl_close($ch); return false; } curl_close($ch); return ($code == 200) ? $data : "server error,code: . {$code}"; }
node 代码
var express = require('express') var bodyParser = require('body-parser') var app = express() var urlencodedParser = bodyParser.urlencoded({ extended: false }) app.use(urlencodedParser, function (req, res) { res.setHeader('Content-Type', 'text/plain') res.write('you posted:\n') res.end(JSON.stringify(req.body, null, 2)) }) app.listen(3000, function() { console.log('Server is running') })
指定了解析方式依然不行。就到body-parser的源码中一行行调试下去。
找到urlencode.js
// determine if request should be parsed if (!shouldParse(req)) { return ('skip parsing'), next() }
这行shouldParse 返回false
再到type-is.js/index.js 返回false。
var value = req.headers['content-type']
function typeofrequest(req, types_) { var types = types_ // no body if (!hasbody(req)) { return null } // support flattened arguments if (arguments.length > 2) { types = new Array(arguments.length - 1) for (var i = 0; i < types.length; i++) { types[i] = arguments[i + 1] } } // request content type var value = req.headers['content-type'] return typeis(value, types) }
发现这里的req.headers['content-type'] 是 multipart/form-data,而type是application/x-www-form-urlencoded
原来,在php执行curl的时候,postData是数组,会将数据编码设置为 multipart/form-data
Note: 传递一个数组到CURLOPT_POSTFIELDS,cURL会把数据编码成 multipart/form-data,而然传递一个URL-encoded字符串时,数据会被编码成 application/x-www-form-urlencoded。
修改pHP代码
curl_setopt($ch, CURLOPT_POSTFIELDS, urlencode(json_encode($postData)));
参考:
http://php.net/manual/zh/function.curl-setopt.php
发表评论
-
将博客搬至CSDN
2017-03-28 09:07 685将博客搬至CSDN,尽情期待 -
laravel入門
2017-03-03 16:31 6811 全局安裝 composer global require ... -
导出csv,excel等文件,文件内容错误的问题,需要加上ob_end_clean
2017-03-02 11:54 1593见这个问题: http://stackoverflow.com ... -
facebook graph api从2.6转到2.8的问题处理
2017-02-15 16:30 1228之前一直用facebook 2.6的api,现在想升级到2.8 ... -
php从mysql读取超过200W行的表
2017-01-04 10:09 680需要从一个大表,如user表中读取所有user数据再做整理并導 ... -
一个session失效的伪命题
2016-12-08 18:33 774最近遇到一个问题,一个ajax请求会调用已存在的session ... -
tp5与tp3的区别
2016-11-21 14:33 1568TP5作了很大的改变,更加灵活,没那么臃肿了,加入了一些令人振 ... -
推送消息能不能区分禁止通知和卸载两种类型?
2016-11-18 10:54 1508消息推送ios用了apns,android用的是gcm。推送失 ... -
yaf在命令行模式下出现PHP Fatal error: Class 'Yaf_Application' not found的解决办法
2016-11-11 16:42 2425为了跑个yaf的crontab,执行时报错: PHP Fata ... -
推送emoji表情乱码的解决方法
2016-11-04 17:44 1994推送内容如果包含了emoji表情,需要做以下修改 1 mysq ... -
YAF访问图片等静态资源禁止调用YAF框架的解决办法
2016-10-20 17:55 1649当访问yafpublic 目录下的某个静态资源时,依然会访问y ... -
在线自动协同编辑文本的实现方案
2016-10-14 16:49 1999要实现可以自动在线协同编辑文本的功能。就类似google do ... -
Paypal支付跳转失败的原因及解决办法
2016-09-18 14:27 3651遇到在跳转到paypal支付页面的时候出现502 bad ga ... -
文件格式不是unix导致sed,cat等读取文件后无法正常退出
2016-08-30 14:44 810#!/bin/bash bucket_config=&quo ... -
aws sdk之nodejs s3
2016-08-19 12:19 2937upload 和putObject有什么区别,同样是上传或新增 ... -
varnish的使用和PHP清除缓存的技巧
2016-08-11 14:10 1315官網地址 https://www.varnish-cache. ... -
TP在APP_DEBUG=false的情況下,CLI和WEBSITE會共用同一個~runtime.php導致出錯的問題解決辦法
2015-12-14 11:43 864TP若使用了 define('APP_DEBU ... -
winston log split by date的解决方案
2015-11-25 11:56 1336winston 是node.js的日志管理工具,但是它的api ... -
nodejs程序后台一直运行
2015-10-22 09:57 2878来源:http://materliu.github ... -
解决nodemailer发送email提示Invalid login 的问题
2015-09-24 10:57 1854上代码 var nodemailer = require ...
相关推荐
// 使用req.body获取请求体中的用户数据,然后执行添加用户操作 }); // 删除用户路由 app.delete('/users/:name', (req, res) => { // 使用req.params.name获取URL参数,然后执行删除用户操作 }); const port = ...
在本项目中,我们主要探讨如何使用Node.js开发一个后台管理系统,特别关注如何获取列表数据以及处理文件类型的提交。Node.js作为一个基于Chrome V8引擎的JavaScript运行环境,因其非阻塞I/O和事件驱动的特性,非常...
Node.js,作为一款基于Chrome V8引擎的JavaScript运行环境,因其非阻塞I/O模型和事件驱动特性,成为了开发REST API的理想选择。本篇文章将深入探讨如何使用Node.js来创建RESTful API,并结合“RESTAPINODEJS-mean”...
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,以其异步非阻塞I/O和事件驱动的特性,使其在处理高并发场景时表现出色,尤其适合构建网络服务,包括RESTful API。 **一、RESTful API基础** RESTful API设计...
// 处理数据(这里仅作为示例) console.log('Received:', data); // 返回成功响应 res.json({ message: 'Data received successfully' }); }); // 启动服务器 const port = 3000; app.listen(port, ...
通过这个名为"firstnodeproject"的项目,我们可以学习到如何利用JavaScript(标签)在Node.js环境中创建RESTful API。REST(Representational State Transfer)是一种设计网络应用程序的架构风格,它使用HTTP协议来...
例如,使用 `morgan` 中间件记录日志,或者 `body-parser` 处理 POST 请求的体数据。 6. **启动应用**:完成项目配置后,通过在入口文件中添加 `app.listen()` 来启动 Express 服务器。例如,`app.listen(3000, () ...
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript编写应用,提供高效、非阻塞I/O操作。Express则是Node.js最流行的Web应用框架,用于构建API和Web应用。 1. **安装依赖*...
本篇将深入探讨一个名为"Quote-API"的项目,这是一个使用Node.js和Express.js构建的小型Web API,主要功能是存储并提供关于计算机、编码和技术的名言。 Express.js是Node.js平台上的一个流行Web应用框架,以其简洁...
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程,从而实现了全栈JavaScript开发。Node.js的优势在于其非阻塞I/O模型和事件驱动的特性,这使得它在处理大量并发...
随着项目的扩大,可能还需要引入其他中间件处理身份验证、日志记录、数据库连接等,但这个简单的起点为你展示了Node.js RESTful服务的基本构建过程。不断学习和实践,你将能够构建出功能强大且健壮的API服务。
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程,极大地拓展了JavaScript的应用范围。`nodeDual`可能是这个项目或者教程的名字,暗示我们将在Node.js环境下...
Node.js 是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript。Express则是一个轻量级的Web应用框架,为开发web应用提供了简洁和灵活的接口。 首先,让我们理解什么是REST...
6. **处理数据** 在路由处理器中,你可以访问请求对象(`req`)和响应对象(`res`)。例如,从数据库查询用户并返回结果: ```javascript app.get('/users', (req, res) => { User.find({}, (err, users) => { ...
2. 使用中间件处理请求体:对于POST、PUT等请求,我们需要解析请求体中的数据,可以使用`body-parser`中间件: ```javascript app.use(express.json()); ``` 3. CRUD操作:根据REST原则,为资源创建、读取、更新和...
Express可以通过`req.body`获取JSON数据。 ### 5. 删除书籍 通过`DELETE`请求来删除书籍: ```http DELETE /books/:id ``` 这里的`:id`是书籍的唯一标识符,服务器会根据这个ID找到并删除对应的书籍。 ### 6. ...
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,让开发者可以在服务器端使用 JavaScript 编程。Node.js 使用事件驱动、非阻塞 I/O 模型,使其在高并发场景下性能优秀,特别适合用于构建网络应用,如 API...
JavaScript是Web开发中的主要脚本语言,尤其在服务器端开发中,Node.js为JavaScript提供了一个强大的运行环境。了解变量、数据类型、控制流(如if语句和循环)、函数以及对象等核心概念至关重要。 【Node.js简介】 ...
在这里,`app.post`定义了一个处理POST请求的路由,`req.body`包含了从表单发送过来的数据。你可以根据需要处理这些数据,然后通过`res.json`返回结果。 除了手动测试,你还可以考虑使用自动化测试工具,比如...
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,因其非阻塞I/O和事件驱动的特性,非常适合开发高并发的网络应用,如REST API。 **1. RESTful API基础** RESTful API设计的核心原则是资源导向,通过HTTP协议...