【问题标题】:http query string: question mark becomes %3http 查询字符串:问号变为 %3
【发布时间】:2019-08-10 09:45:15
【问题描述】:

试图追加到现有的查询字符串,但是“?”继续查询字符串被替换为 '%3'

 server := "server.com"
 endpoint:= "/buildWithParameters?token=<top_secret>" 

// concat server and build job
    u, err := url.Parse(server)
    u.Path = path.Join(u.Path, endpoint)
    endpoint := u.String()

    // since we are appending to existing querystring, request is needed for parsing
    req, err := http.NewRequest("POST", endpoint, nil)
    if err != nil {
        return fmt.Errorf("Error creating post request: (%v)", err)
    }

    // read existing query string
    q := req.URL.Query()


    q.Add("key", "value")

    req.URL.RawQuery = q.Encode()


    log.Println(req.URL.String())

输出是:

https://server.com/job/jobbyjob/buildWithParameters%3Ftoken=<top_secret>?key=value

【问题讨论】:

    标签: go url


    【解决方案1】:

    这是因为您将查询字符串附加到路径,因此库正确转义 ? 以生成有效 URL。如果您希望 token=&lt;top_secret&gt; 被视为查询的一部分,则需要将其添加到查询中:

    endpoint:= "/buildWithParameters" 
    
    // ... 
    
    q.Add("token", "<top_secret>")
    

    【讨论】:

    • 谢谢,是的,路径库是问题所在。我改用 .ResolveReference ,它的工作非常棒
    【解决方案2】:

    正如@Flimzy 指出的那样,是路径库导致了我的问题。下面的 base.ResolveReference() 方法解析:

    // concat server and build job
    u, err := url.Parse(server)
    u.Path = path.Join(u.Path, endpoint)
    endpoint := u.String()
    

    替换为:

    // concat server and build job
    base, err := url.Parse(server)
    endpoint, err := url.Parse(endpoint)
    endpoint = base.ResolveReference(endpoint)
    

    【讨论】:

      【解决方案3】:

      您使用url.Parse 创建它,然后将查询字符串附加到路径(通过转义它可以正确处理)。如果你反过来做(构建完整的 URL,然后解析它),它就可以完成它的工作:

      server := "server.com"
      endpoint := "/buildWithParameters?token=<top_secret>" 
      
      // concat server and build job
      u, err := url.Parse(path.Join(server, endpoint))
      

      【讨论】:

        猜你喜欢
        • 2012-10-07
        • 2011-04-28
        • 2014-02-15
        • 1970-01-01
        • 2014-02-25
        • 1970-01-01
        • 2011-06-09
        • 2011-12-21
        • 2011-04-19
        相关资源
        最近更新 更多