网关接口获取不到post数据问题

简介: 不知道大家有没有接触过clearsilver框架,是由C语言开发一套common gateway interface框架,下称CGI,在C语言开发的场景中用于开发http接口的一种方式。下文集中于阐述和解决在clearsilver框架上CGI接口线上遇到的问题及解决思路,供大家参考。

问题描述:

在封装cgi库支持fastcgi从而在Nginx下通过spawn-fcgi方式运行时,发现通过jQuery ajax方式POST提交的数据在cgi侧获取为空。


解决思路:

按照数据流向,请求是否到达了服务器,Nginx是否成功转发,CGI接口里再细分看数据传递到了哪一步。


1.先确认数据是否确实提交到服务器

工具:Fiddler

image.png


如上图所示,可以看到在调用接口提交的时候确实传递了参数。


2.是否是Nginx转发出了问题

因为这个请求参数是在request_body里,为了减少输出对磁盘的影响,Nginx默认是不打印的,因此这个需要手动配置下Nginx的默认配置,在log_format配置项中增加@request_body,并重启Nginx。

image.png

然后重新触发请求,查看Nginx日志,发现确实是收到了请求并做了转发。

image.png


3.新的线索:通过form表单 submit方式post提交,可以获取到数据

通过fiddler抓包看看form表单提交和ajax方式提交有啥区别

image.png

image.png



多出项
不同项
表单提交 X-Requested-With: XMLHttpRequest Content-Type: application/x-www-form-urlencoded
$ajax方式 Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded; charset=UTF-8


4.通过截包并篡改头部确认关键点

Fiddler -> Rules -> Automatic Breakpoints -> Before Requests 或者F11


发现,当将ajax提交的Content-Type中的“; charset=UTF-8”去掉后,cgi可以获取到post数据。


5.猜测cgi使用的clearsilver框架对post方式解析数据存在问题

image.png


问题果然出现在这里,改为if (type && !strncmp(type, "application/x-www-form-urlencoded", 33))即可。


6.根因分析

$ajax方式post数据时,Content-Type为何会多出后面的部分?


通过查看Jquery官网: http://api.jquery.com/jQuery.ajax/ 发现

image.png


除了修改clearsilver框架外,我们还可以通过在js提交请求时显示指定contentType来进行规避,参考如下:

$.ajax({    
type: "POST",    
url: url,    
contentType:"application/x-www-form-urlencoded",    
data: postData,    
dataType:"json",    
success: function(result){        
if (typeof(result)!="undefined"&&0==result.code) {            
console.log('suc');        
    }    
  }});


以上。

相关文章
|
5月前
|
DataWorks 安全 API
在DataWorks中创建的接口如果要使用API网关进行鉴权
【4月更文挑战第3天】在DataWorks中创建的接口如果要使用API网关进行鉴权
58 2
|
11月前
|
负载均衡 应用服务中间件 API
微服务技术系列教程(25) - SpringCloud- 接口网关服务Zuul
微服务技术系列教程(25) - SpringCloud- 接口网关服务Zuul
181 0
|
Java API Nacos
巧用网关白名单实现接口免鉴权
分享技术,用心生活 场景描述:一般系统中提供的接口都是经过统一配置鉴权的,比如不登录不能访问。但是,一些接口是需要开放给客户用的,我称作open API。那么这时候你不能要求客户先登录你的接口再去调用吧。那么,这时候就可以通过网关白名单来实现免鉴权
巧用网关白名单实现接口免鉴权
|
5月前
|
缓存 安全 API
【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现
公司对外开放的OpenAPI-Server服务,作为核心内部系统与外部系统之间的重要通讯枢纽,每天处理数百万次的API调用、亿级别的消息推送以及TB/PB级别的数据同步。经过多年流量的持续增长,该服务体系依然稳固可靠,展现出强大的负载能力。
159 9
【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现
|
存储 安全 PHP
【100天精通Python】Day48:Python Web开发_WSGI网络服务器网关接口与使用
【100天精通Python】Day48:Python Web开发_WSGI网络服务器网关接口与使用
95 0
|
3月前
|
物联网
好的资源链接,gitee全糖咖啡,B站视频转成mp4,全糖咖啡 / 物联网网关数据上传,,全糖咖啡 / springboot+百度智能车牌检测
好的资源链接,gitee全糖咖啡,B站视频转成mp4,全糖咖啡 / 物联网网关数据上传,,全糖咖啡 / springboot+百度智能车牌检测
|
11月前
|
域名解析 监控 安全
接口开放太麻烦?试试阿里云API网关吧
我在[多方合作时,系统间的交互是怎么做的?](https://www.cnblogs.com/wlovet/p/17466812.html)这篇文章中写过一些多方合作时接口的调用规则和例子,然而,接口开放所涉及的安全、权限、监控、流量控制等问题,可不是简简单单就可以解决的,这一般需要专业的开放平台来支撑。但为了开放几个接口就要做一个开放平台,实在是不合算。为此阿里云为了解决这类需求推出了一款强大的工具——API网关。本文将介绍阿里云API网关的特点和优势,以及如何使用API网关来简化接口开放的过程。
373 0
接口开放太麻烦?试试阿里云API网关吧
|
5月前
|
机器学习/深度学习 XML 数据格式
CGI通用网关接口
CGI通用网关接口
|
5月前
|
网络虚拟化 网络架构
配置基于接口划分VLAN示例(汇聚层设备作为网关)
划分VLAN的方式有:基于接口、基于MAC地址、基于IP子网、基于协议、基于策略(MAC地址、IP地址、接口)。其中基于接口划分VLAN,是最简单,最常见的划分方式。 基于接口划分VLAN指的是根据交换机的接口来划分VLAN。网络管理员预先给交换机的每个接口配置不同的PVID,当一个数据帧进入交换机时,如果没有带VLAN标签,该数据帧就会被打上接口指定PVID的Tag,然后数据帧将在指定PVID中传输。 在典型的分层组网中,当接入交换机是二层交换机时,可以使用汇聚交换机作为用户的网关。另外使用汇聚交换机作为用户的网关还可以简化接入交换机的配置,使用户通过一个出接口访问外部网络,便于维护和管
230 0
|
5月前
|
Dubbo Cloud Native 应用服务中间件
调研 7 个开源项目后,这家数据合规平台如何构建高性能网关
调研 7 个开源项目后,这家数据合规平台如何构建高性能网关