`
flex_莫冲
  • 浏览: 1090212 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

node.js获取php curl post数据req.body为空的处理

阅读更多
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 代码
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
分享到:
评论

相关推荐

    Node.js和MongoDB的小实例

    // 使用req.body获取请求体中的用户数据,然后执行添加用户操作 }); // 删除用户路由 app.delete('/users/:name', (req, res) =&gt; { // 使用req.params.name获取URL参数,然后执行删除用户操作 }); const port = ...

    node.js开发后台管理系统,列表数据获取和新纪录提交(包括获取file类型提交)

    在本项目中,我们主要探讨如何使用Node.js开发一个后台管理系统,特别关注如何获取列表数据以及处理文件类型的提交。Node.js作为一个基于Chrome V8引擎的JavaScript运行环境,因其非阻塞I/O和事件驱动的特性,非常...

    RESTAPINODEJS:使用Node.js休息Api

    Node.js,作为一款基于Chrome V8引擎的JavaScript运行环境,因其非阻塞I/O模型和事件驱动特性,成为了开发REST API的理想选择。本篇文章将深入探讨如何使用Node.js来创建RESTful API,并结合“RESTAPINODEJS-mean”...

    api-rest-nodejs:node.js中的Api Rest

    Node.js是一个基于Chrome V8引擎的JavaScript运行环境,以其异步非阻塞I/O和事件驱动的特性,使其在处理高并发场景时表现出色,尤其适合构建网络服务,包括RESTful API。 **一、RESTful API基础** RESTful API设计...

    express post使用

    // 处理数据(这里仅作为示例) console.log('Received:', data); // 返回成功响应 res.json({ message: 'Data received successfully' }); }); // 启动服务器 const port = 3000; app.listen(port, ...

    firstnodeproject:创建了一个简单的CRUD流程,供用户了解node.js REST API的细微差别

    通过这个名为"firstnodeproject"的项目,我们可以学习到如何利用JavaScript(标签)在Node.js环境中创建RESTful API。REST(Representational State Transfer)是一种设计网络应用程序的架构风格,它使用HTTP协议来...

    myNpdeProject.rar

    例如,使用 `morgan` 中间件记录日志,或者 `body-parser` 处理 POST 请求的体数据。 6. **启动应用**:完成项目配置后,通过在入口文件中添加 `app.listen()` 来启动 Express 服务器。例如,`app.listen(3000, () ...

    redisNode:从Redis缓存返回值

    Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript编写应用,提供高效、非阻塞I/O操作。Express则是Node.js最流行的Web应用框架,用于构建API和Web应用。 1. **安装依赖*...

    Quote-API:一个小型Express.js Web API,用于存储和提供有关计算机,编码和技术的不同报价

    本篇将深入探讨一个名为"Quote-API"的项目,这是一个使用Node.js和Express.js构建的小型Web API,主要功能是存储并提供关于计算机、编码和技术的名言。 Express.js是Node.js平台上的一个流行Web应用框架,以其简洁...

    node-rest-api

    Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程,从而实现了全栈JavaScript开发。Node.js的优势在于其非阻塞I/O模型和事件驱动的特性,这使得它在处理大量并发...

    node-rest-server

    随着项目的扩大,可能还需要引入其他中间件处理身份验证、日志记录、数据库连接等,但这个简单的起点为你展示了Node.js RESTful服务的基本构建过程。不断学习和实践,你将能够构建出功能强大且健壮的API服务。

    nodeDual:使用Node创建API

    Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程,极大地拓展了JavaScript的应用范围。`nodeDual`可能是这个项目或者教程的名字,暗示我们将在Node.js环境下...

    node-api-tutorial

    Node.js 是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript。Express则是一个轻量级的Web应用框架,为开发web应用提供了简洁和灵活的接口。 首先,让我们理解什么是REST...

    node-express-base:Express Node API Rest的基础

    6. **处理数据** 在路由处理器中,你可以访问请求对象(`req`)和响应对象(`res`)。例如,从数据库查询用户并返回结果: ```javascript app.get('/users', (req, res) =&gt; { User.find({}, (err, users) =&gt; { ...

    REST_API_Node_Express:使用Node和Express构建REST Api

    2. 使用中间件处理请求体:对于POST、PUT等请求,我们需要解析请求体中的数据,可以使用`body-parser`中间件: ```javascript app.use(express.json()); ``` 3. CRUD操作:根据REST原则,为资源创建、读取、更新和...

    book_API:我的第一个Book API,用于从使用Express NodeJ构建的库中添加,删除,搜索和借书。 经过Advanced TEST客户端测试。 请在必要时提出建议和更正

    Express可以通过`req.body`获取JSON数据。 ### 5. 删除书籍 通过`DELETE`请求来删除书籍: ```http DELETE /books/:id ``` 这里的`:id`是书籍的唯一标识符,服务器会根据这个ID找到并删除对应的书籍。 ### 6. ...

    SimpleExpressApi:显示如何创建简单的nodeexpress API

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,让开发者可以在服务器端使用 JavaScript 编程。Node.js 使用事件驱动、非阻塞 I/O 模型,使其在高并发场景下性能优秀,特别适合用于构建网络应用,如 API...

    Curso节点--Rest服务器基础

    JavaScript是Web开发中的主要脚本语言,尤其在服务器端开发中,Node.js为JavaScript提供了一个强大的运行环境。了解变量、数据类型、控制流(如if语句和循环)、函数以及对象等核心概念至关重要。 【Node.js简介】 ...

    本地进行API接口测试

    在这里,`app.post`定义了一个处理POST请求的路由,`req.body`包含了从表单发送过来的数据。你可以根据需要处理这些数据,然后通过`res.json`返回结果。 除了手动测试,你还可以考虑使用自动化测试工具,比如...

    API-REST-NodeJS-Example

    Node.js是一个基于Chrome V8引擎的JavaScript运行环境,因其非阻塞I/O和事件驱动的特性,非常适合开发高并发的网络应用,如REST API。 **1. RESTful API基础** RESTful API设计的核心原则是资源导向,通过HTTP协议...

Global site tag (gtag.js) - Google Analytics