IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> go发送多维数组的form格式的post请求 -> 正文阅读

[PHP知识库]go发送多维数组的form格式的post请求

解决的问题是 go发送多维数组的form格式的post请求

前提:只能是form格式,json是没有这个问题的

就是发送如下php格式application/x-www-form-urlencoded的post请求

$form_params=array (
  'r_list' =>
  array (
    0 => 
    array (
      'r_address' => 'r_address',
      'r_city' => 'r_city',
      'r_district' => 'r_district',
      'r_mobile' => 'r_mobile',
      'r_name' => '收货人',
      'r_province' => 'r_province',
      'shop_order' => 'shop_order',
    ),
    1 => 
    array (
      'r_address' => 'r_address2',
      'r_city' => 'r_city2',
      'r_district' => 'r_district2',
      'r_mobile' => 'r_mobile2',
      'r_name' => '收货人1',
      'r_province' => 'r_province2',
      'shop_order' => 'shop_order2',
    ),
  ),
  'send_address' => 'send_address',
  'send_city' => 'send_city',
  'send_district' => 'send_district',
  'send_mobile' => 'send_mobile',
  'send_name' => 'send_name',
  'send_province' => 'send_province',
  'username' => 'nanyounan',
)
$client = new Client();
$request = new Request('POST', 'xxxxxxx', [
     'form_params' => $form_params
 ]);

问题:go怎么写这样多维数组的请求

细分为下面的几个问题

  1. go和php的接收差异
    go在请求时吧map[key][]value 转成了key=value1&key=value2,而不是key[0]=value1&key[1]=value2,这样php在接收时只能接受到一个value
  2. go的form格式的post请求限制
    go在把form格式的post请求进行转码的时候,很多都是只解析表层,例如:
    如果遇到一维数组的话,他是解析成key=value1&key=value2
    如果遇到二维数组的话,他解析失败,因为解析键值对(key=value)的时候,默认的值(value)是字符串,不是数组.但是二维数组键值对的值是一个数组(map类型),go就会解析失败

重点来了.解决思路:自己手写解析后的字符串,让go直接传递解析后的form格式的post请求

ploady:=make(url.Values)
ploady.Set("send_name",sendName)
ploady.Set("send_mobile",sendMobile)
ploady.Set("send_province",sendProvince)
ploady.Set("send_province",sendProvince)
ploady.Set("send_city",sendCity)
ploady.Set("send_district",sendDistrict)
ploady.Set("send_address",sendAddress)
for i, n := 0, len(rList); i < n; i++ { // 常见的 for 循环,支持初始化语句。
	for key, v := range rList[i] {  //循环数组
		valueToString := v.(string) //ploady.set方法只能是字符串,把value值从interface类型转为string类型,避免
		ploady.Set(fmt.Sprintf("%s%d%s%s%s","r_list[",i,"][",key,"]"),valueToString)
	}
}
res := newHttpPostForm("/api/buyOrders", ploady)
	
func newHttpPostForm(postUrl string, payload url.Values) map[string]interface{}{
	fmt.Println(payload)
	resp, _ := http.PostForm("http://127.0.0.1:8080/open/app",payload)
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(body))
	var res map[string]interface{}
	_ = json.Unmarshal(body, &res)
	return res
}

后记

如果以上方式不适用的话,可以通过php的http_build_query方法获取post请求值的转码,然后通过go的url.QueryUnescape方法获取到具体的格式,然后自己编写字符串

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 15:09:09  更:2021-08-17 15:10:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/14 3:03:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码