`

url里的参数是hash形式的写法:

    博客分类:
  • url
 
阅读更多

先说调研的结果

url的参数是hash形式,比如state={user_id: 2, sign='hello'},如果写到url里应该写成:

http://root/path?state[user_id]=2&state[sign]=%2Fhello(注:引号需要编码)

下面找到这个答案的过程:

1、查url参数:URL 参数是追加到 URL 上的一个名称/值对,参数以问号"?"开始并采用 name=value 的格式。多个参数时参数之间用“&”符号隔开。如:http://server/path/document?name1=value1&name2=value2;
 1.1value常用的类型是string,也可以是数组,对象
 1.2如果是数组,就写成name[1,2],数组的元素之间不要用空格,如果真的需要就对参数编码。如:http://server/path/document?name=[1,2]或者http://server/path/document?name=%5b2%2c+3%5d
 1.3如果是对象,不要写成name={key_1: value_1, key_2: value_2}的形式,直接写成key-value形式,即使进行编码也会报baduri的错误,正确的写法应该是:name[key_1]=value_1&name[key_2]=value_2.如:http://server/path/document?name[key_1]=value_1&name[key_2]=value_2

2、因为用request测试,发现get方法传的第二个参数即是url的参数,但是这个参数是原味的hash,如下:
写了一个request测试用例A:
  it "should login" do
      state = {user_id: user.id, redirect_url: '/mobile'}
      get "/mobile/login", {state: state, code: code}
      expect(response).to redirect_to('/mobile')
  end
state是所传的参数,是个hash形式,如果url写成:get "/mobile/login?{state: {user_id: user.id, redirect_url: '/mobile}, code: '123’}”就报错了:bidder。
刚开始对baduri的错误信息不知道如何打log看更多信息,就直接查baduri的错误,没有找到参数是hash的url,所以也就不知道参数是hash的url到底哪不对;然后尝试将hash参数进行encode编码,依然报baduri的 错误;
之前对引入的第三方库的代码,也就是源码,很少去看,更不会想到通过源码去调试。经前辈循序渐进的指点,才去看源码,尝试在源码的get方法里打log,发现打不出log,但是确实跟踪到get方法的源码了,就想当然地认为无法在控制台打印出第三方库的信息;然后只好老实地读代码,但是发现源码的方法一个套一个,这也无所谓,我只要知道url组成的方法就行,所以找到build_url的方法,里面同样套了很多方法,而且看不懂的代码也不少,实在读不下去了,最后想硬着头皮去查,打算弄懂所有的代码,可是这样做很不现实,等弄明白的时候都不知道何年何月了。在尝试在源码里打log的做法失败后,只好继续去读源码,可能是资料看得多了,最关键词有一定敏感度了,再看源码,居然注意到了request和response变量,reponse实在request请求之后得到的响应,那么排除response,也就是request了,最后在build_request_uri方法里发现了四行行很有用的代码:
         line1: url, query_string = @routes.url_for(options).split("?", 2)
         line2: @request.env["SCRIPT_NAME"] = @controller.config.relative_url_root
         line3: @request.env["PATH_INFO"] = url
         line4: @request.env["QUERY_STRING"] = query_string || “"
猜测line1是将url通过“?”分成两部分分别赋值给url喝query_string, 那么query_string就是url所带的参数,跟着看到line4中将query_string赋值给@request.env["QUERY_STRING”],所以我猜测要的url参数就是@request.env["QUERY_STRING”]了,然后就试着在测试用例A的get请求之后打印出@request.env["QUERY_STRING”]:
it "should login" do
      state = {user_id: user.id, redirect_url: '/mobile'}
      get "/mobile/login", {state: state, code: code}
      p @request.env["QUERY_STRING”]
      expect(response).to redirect_to('/mobile')
  end
打印的结果是:“state[user_id]=2&state[redirect_url]=%2Fmobile&code=123”,现在结果已经出来了,hash参数是可以传的,但是需要将每个元素单独拿出来做参数放在url里。

在调试的过程中,前辈提醒我去读源码,但是一看源码那么多,就读不下去了,放弃读源码后,又是一阵瞎猜乱试,甚至到最后都忘了自己是为了找出hash的参数是如何组装的,而变成否定url中的参数不能是hash形式的。调试不能单纯地靠猜,靠瞎调试;读源码要抓住关键信息,不必弄明白所有的源码。

分享到:
评论

相关推荐

    url-hash:为防篡改 url 添加哈希参数的节点库

    网址哈希为防篡改 url 添加哈希参数的节点库注意:此模块不适用于涉及敏感数据的应用程序。 它提供了一个简单的限制,以避免篡改 url 参数,或为链接添加基本的到期时间。基本用法将哈希添加到 url // require ...

    各种Hash函数(JAVA版)

    RS-Hash Function Value: " + ghl.RSHash(key)); System.out.println(" 2. JS-Hash Function Value: " + ghl.JSHash(key)); System.out.println(" 3. PJW-Hash Function Value: " + ghl.PJWHash(key)); System....

    Nginx安装url_hash插件.doc

    url_hash 是nginx的第三方模块,nginx本身不支持,需要打patch . Url_hash 你nginx在做负载均衡的时候。把转发的URL 以hash的形式保存。这样可以保证同一个URL始终 分给同一个real server,来提高访问速度。

    c++中hash_table以及std::map应用案例

    代码重点是hash_table,附加std::map与其做对比,实现的是一条sql语句:select c_nationkey, c_mktsegment, count(*), max(c_acctbal) from aaa_customer_1g group by c_nationkey, c_mktsegment order by c_...

    Nginx如何配置url_hash转发方式.docx

    Nginx如何配置url_hash转发方式.docx

    hash_param:将Hash对象转换为形式参数

    hash_param hash_param是一个库,可将带有单个“数据”参数Hash的函数转换为带有命名形式参数的函数。 这样可以使ActionCable之类的API更加易于使用。 例如,它可以将其变为: class ChatChannel < ...

    react-hash:React自定义钩子以从URL获取哈希

    React自定义钩子以从URL获取哈希值。 目录 安装 npm: npm install react-hash 纱: yarn add react-hash 用法 import React from 'react' ; import { useHash } from 'react-hash' ; const App = ( ) => { ...

    一种基于传输触发体系结构的可重构Hash函数处理器:TTAH.pdf

    一种基于传输触发体系结构的可重构Hash函数处理器:TTAH.pdf

    use-hash-param:React钩子用于处理URL片段中的参数

    useHashParam React挂钩可让您的状态与URL参数保持同步。安装npm install --save use-hash-param用法import React from 'react' ;import useHashParam from 'use-hash-param' ;function ControlledInput ( ) { const...

    hash_ring:水晶一致性哈希环的实现

    安装将此添加到应用程序的shard.yml : dependencies : hash_ring : github : TobiasGSmollett/hash_ring用法require " hash_ring "# Register 3 servershash_ring = HashRing :: HashRing .new([ " one " , " two ...

    hashcat [hashcat wiki].rar

    hashcat is the world’s fastest and most advanced password recovery tool. This version combines the previous CPU-based hashcat (now called hashcat-legacy) and GPU-based oclHashcat. Hashcat is ...

    UrlHash/锚点

    使用《UrlHash/锚点》解决移动设备中的单页面应用的物理[返回键]带来的困扰 示例代码

    geohash:简单PHP geohash类

    echo GeoHash::encode(117.031689,36.65396);结果是wwe0x0euu12。 默认精度为0.00001,可以通过编码方法的第三个参数进行更改。 找到给定的geohash的邻居: use Lvht\GeoHash;var_dump(GeoHash::expand('wwe0x0'));...

    geohash-java:Geohash的Java实现

    geohash-java a Java implement of Geohash 提供下列接口: Modifier and Type Method and Description String toGeoHash(double lng, double lat) 根据经纬度计算 geohash String toGeoHash(double lng, double lat...

    meow_hash_cpp:Casey Muratori利用现代C ++功能更干净地重写了喵喵哈希

    meow_hash_cpp 这是对Casey的Muratori Meow哈希( )的重写,利用现代C ++功能来显着整理代码库并摆脱原始实现中存在的大量未定义行为。 兼容性 编译器 最小版本 MSVC(Visual Studio) 19.1(VS 2017.3 P2) 铛 ...

    geohash:用于golang的geohash

    ## geohash geohash算法: : package mainimport ("fmt""github.com/gansidui/geohash")func main () {latitude := 39.92324longitude := 116.3906precision := 5hash , box := geohash . Encode ( latitude , ...

    hashcat-master

    在Hashcat诞生之前已经有一些近乎完美的密码破解工具,例如“PasswordsPro”、“John The Ripper”,2009年出世的Hashcat则实现了对于现代CPU多内核的利用。 Hashcat在操作系统上支持Windows 7/8/10、Apple OS X ...

    Hash-Storage:( PRE ALPHA 原型) 多用途持久哈希存储

    Hash::Storage - 持久性哈希存储框架 模块处于开发阶段。 不要使用它。 概要 my $st = Hash::Storage->new( driver => [ OneFile => { serializer => 'JSON', file => '/tmp/t.json' } ] ); # Store hash by id ...

    Hash校验 插件形式的文件校验

    Hash校验 、插件形式的文件校验软件使用很方便 这个是最新版

    高运算性能,低碰撞率的hash算法MurmurHash算法.zip

    MurmurHash算法由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc 、nginx、libmemcached,Redis,Memcached,Cassandra,HBase,Lucene等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的...

Global site tag (gtag.js) - Google Analytics