package main
import (
"fmt"
"net/url"
)
func main() {
url, err := url.ParseRequestURI("https://www.zhoubotong.site") // 注意这里必须带有http/https协议,
//否则会被认定非合法url,但是使用//www.zhoubotong.sit,被返回空,所以error哪里会被绕过,该示例代码不够严谨
if err != nil {
fmt.Println(err)
return
}
fmt.Println(url.Hostname())
}
func main() {
url, err := url.ParseRequestURI("www.zhoubotong.site") // www.zhoubotong.site" 或者zhoubotong.site"
if err != nil {
fmt.Println(err)
return
}
fmt.Println(url.Hostname())
}
输出:parse "www.zhoubotong.site": invalid URI for request,既然上面的代码不够严谨,如何改善呢?完整代码如下:
package main
import (
"fmt"
"net/url"
)
func main() {
var u string = "https://www.zhoubotong.site"
_, err := url.ParseRequestURI(u)
if err != nil {
fmt.Println(err)
return
}
url, err := url.Parse(u)
if err != nil || url.Scheme == "" || url.Host == "" {
fmt.Println(err)
return
}
fmt.Println(url.Hostname(), "success")
}
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"time"
)
// 定义返回的响应体
type Response struct {
Params string `json:"params"`
Headers map[string]string `json:"headers"`
Origin string `json:"origin"`
Url string `json:"url"`
}
var remoteUrl string = "https://www.baidu.com"
// 获取带参数的http get请求响应数据
func getUrlParse() {
data := url.Values{}
data.Set("username", "乔峰")
data.Set("sex", "male")
u, err := url.ParseRequestURI(remoteUrl)
if err != nil {
fmt.Println(err)
}
u.RawQuery = data.Encode()
fmt.Println(u.RawQuery)
resp, err := http.Get(u.String())
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close() // 一定要关闭释放tcp连接
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(body))
}
// 解析get请求的返回的json结果到struct
func getResultToStruct() {
resp, err := http.Get(remoteUrl)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
var res Response // 定义res为Responser结构体
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
_ = json.Unmarshal(body, &res) // 注意这里是&res 地址引用
fmt.Printf("%#v\n", res)
}
//get 请求添加头消息
func getHttpByHeader() {
param := url.Values{}
param.Set("username", "babala")
param.Set("sex", "female")
u, _ := url.ParseRequestURI(remoteUrl)
u.RawQuery = param.Encode() // 把参数转换成 sex=female&username=babala
fmt.Println(u)
//重点注意:如果我们直接使用默认的http,那么它是没有超时时间的。这样就会带来性能问题,具体稍后写一篇详细介绍这块
client := &http.Client{Timeout: 10 * time.Second}
req, err := http.NewRequest("GET", u.String(), nil)
if err != nil {
fmt.Println(err)
}
// 添加请求头header 参数
req.Header.Add("username2", "风清扬")
req.Header.Add("age1", "89")
resp, _ := client.Do(req)
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(body))
}
func main() {
getResultToStruct()
getHttpByHeader()
}
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strings"
"time"
)
var remoteUrl = "https://www.zhoubotong.site"
// 发送表单post请求
func postByForm() {
param := url.Values{}
param.Add("username", "乔峰")
param.Add("sex", "male")
resp, _ := http.PostForm(remoteUrl, param) // 表单提交"Content-Type": "application/x-www-form-urlencoded"
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
// 发送表单提交,可以对比上面的postByForm的实现差异
func postByForm2() {
urlValue := url.Values{
"username": {"乔峰"},
"sex": {"male"},
}
respData := urlValue.Encode()
fmt.Println(respData) // encode转码:name=%E4%B9%94%E5%B3%B0&sex=male
resp, _ := http.Post(remoteUrl, "text/html", strings.NewReader(respData))
//注意接收数据类型为text/html,对应在postman中的x-www-form-urlencoded中的key value参数
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
// 发送json数据
func postJson() {
client := &http.Client{Timeout: time.Second * 10}
param := make(map[string]interface{})
param["username"] = "乔峰"
param["sex"] = "male"
respdata, _ := json.Marshal(param) // respdata[]byte类型,转化成string类型便于查看
req, _ := http.NewRequest("POST", remoteUrl, bytes.NewReader(respdata))
//http.NewRequest请求会自动发送header中的Content-Type为applcation/json,对应在postman中的body的raw的json参数
resp, _ := client.Do(req)
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
// 发送json数据,注意和上面实现的区别
func postJson2() {
param := make(map[string]interface{})
param["username"] = "乔峰"
param["sex"] = "male"
respdata, _ := json.Marshal(param) // respdata[]byte类型,转化成string类型便于查看
fmt.Println(string(respdata))
resp, _ := http.Post(remoteUrl, "application/json", bytes.NewReader(respdata))
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
/*
对应的postman中params中的key value参数,我估计很多人都很迷惑postman工具的params和body两个地方传递参数的区别,
其实Params处设置的变量请求时会url后问号传参(?x=y)。而Body里设置的参数则是接口真正请求时发的参数,下面这个例子就是通过params传参
*/
func postString() {
param := url.Values{}
param.Add("username", "babala")
param.Add("sex", "female")
u, _ := url.ParseRequestURI(remoteUrl)
u.RawQuery = param.Encode()
fmt.Println(u)
client := &http.Client{}
req, _ := http.NewRequest("POST", u.String(), nil) // 注意发送数据类似为string的post请求,对应的postman中params中的key value参数
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
func main() {
//postByForm()
//postByForm2()
//postJson()
//postJson2()
postString()
}
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些