go语言学习第八天==》mysql数据库增删改查、用go语言 客户端(client)发起htttp get请求,post请求,postForm请求,Head请求,Do请求

go语言学习第八天==》mysql数据库增删改查、用go语言写 客户端(client)发起htttp get请求,post请求,postForm请求,Head请求,Do请求

  • 引包
    import的作用是引包,当引入包时,该包下文件的所有init()函数都会被执行,并且可以使用该包下的所有函数
    当使用"_"符号时表示只执行包内init()函数 不引入包名内的其他函数
import (
    "database/sql"
    //注意看如上对"_"符号的描述
    _ "github.com/go-sql-driver/mysql"
)
  • 连接数据库函数

注:open在执行时只设置连接参数,没有真正连接数据库
只在实际操作时才真正连接数据库

sql.open(驱动名,数据源dsn)(*DB,err)
//即(其中[]内表示可选)
sql.open(驱动名,“用户名:密码@[连接方式](主机:端口号)/数据库名[?参数=值]”)
//举列
db,err:=sql.open("mysql","root:tiger@(127.0.0.1:3306)/test")

查询:

rows, _ := db.Query("select * from ...");

查询单行

rows, _ := db.QueryRow("select * from ...");

曾删改

rows,_:=db.Exec(...)

预处理语句

stmt,_:=db.Prepare("select * from userinfo where username=?")

demo:
使用预处理语句的增删改查

package main

import (
    "database/sql"
     _ "github.com/go-sql-driver/mysql"
    "fmt"
)

//定义结构体用于存储查询到的行数据信息
type userinfo struct{
    Id int16
    Username string 
    Age  int16
}

func main(){
	//设置连接参数
    db,_:=sql.Open("mysql","root:tiger@(127.0.0.1:3306)/test")
	defer db.Close()
	var uu userinfo
    username:="aaa"

    ///查询
    stmt,_:=db.Prepare("select * from  userinfo where username=?")
    rows,_:=stmt.Query(username)
    for rows.Next(){
        //Scan里面的参数个数必须和查询得到的行内数据个数一致
        //比如rows.Scan(&uu.Id,&uu.Username)将取不到值
        rows.Scan(&uu.Id,&uu.Username,&uu.Age)
        fmt.Println(uu.Id,uu.Username,uu.Age)
    }


	
    / 增加
    // 上面定义过stmt所以不用:=
    stmt,_=db.Prepare("insert into userinfo values(?,?,?)")
    uu.Id=98
    uu.Username="block"
    uu.Age=98
    ret,_:=stmt.Exec(uu.Id,uu.Username,uu.Age)
    //获取影响的行数
    ins_nums,_:=ret.RowsAffected()
    fmt.Println("增加数据影响行数",ins_nums)


    //删除
    stmt,_=db.Prepare("delete from userinfo where username=?")
    uu.Username="block"
    //上面定义过ret所以不用:=
    ret,_=stmt.Exec(uu.Username)
    ins_nums,_=ret.RowsAffected()
    fmt.Println("删除数据影响行数",ins_nums)


    //修改
    stmt,_=db.Prepare("update userinfo set age=? where username=?")
    uu.Username="ttt"
    uu.Age=999
    ret,_=stmt.Exec(uu.Age,uu.Username)
    ins_nums,_=ret.RowsAffected()
    fmt.Println("修改数据影响行数",ins_nums)

    ///批量增加
    stmt,_=db.Prepare("insert into userinfo values(?,?,?)")
    /*
        u1:=userinfo{
            Id:   6,
            Username:   "kkk",
            Age:    777,
        }
        u2:=userinfo{
            7,
            "kkk",
            777,
        }
        us:=[2]userinfo{u1,u2}

    */
    //或者这样初始化
    us:=[2]userinfo{
        {
            66,
            "kkk",
            777,
        },
        {
            77,
            "kkk",
            777,
        },
    }
    for _,u :=range us{
        ret,_=stmt.Exec(u.Id,u.Username,u.Age)
        ins_nums,_=ret.RowsAffected()
        fmt.Println("增加数据影响行数",ins_nums)
    }
    

}



  • 发起http请求

1发起http的get请求
原型

func (c *Client) Get(url string) (r *Response, err error)
package main
import (    
"io/ioutil"
"fmt"    
"net/http"
"log"
"encoding/json"
)
func main(){  
	
	resp, err := http.Get("http://127.0.0.1:8888/test")    
	if err != nil {        
		log.Fatal(err)    
	}    
	defer  resp.Body.Close()    
		
	body, err := ioutil.ReadAll(resp.Body)    
	if err != nil {        
		log.Fatal(err)    
	}   
	 
	///
	//如果返回为json数据则可以进行json解析
	//这里解析为map
	myMap := make(map[string]interface{})
	// json.Unmarshal([]byte(jsonBuf), &m1)
	json.Unmarshal(body, &myMap)
	fmt.Println(myMap)
	
	
	
	fmt.Println(string(body))
}

2发起post请求
原型
参数为:请求地址、将要 POST 数据的资源类型(MIMEType)、数据的比特流([]byte形式)

func (c *Client) Post(url string, bodyType string, body io.Reader) (r *Response, err      error) 

//第二个参数要设置成”application/x-www-form-urlencoded”,
//否则post参数无法传递

package main
import (    
"io/ioutil"
"fmt"    
"net/http"
"log"
"encoding/json"
"strings"
)
func main(){  

	//第二个参数要设置成”application/x-www-form-urlencoded”,
	//否则post参数无法传递
	//传图片使用
	//resp, err := http.Post("http://example.com/upload", "image/jpeg", &imageDataBuf) 
	resp, err := http.Post("http://127.0.0.1:8888/test",
		"application/x-www-form-urlencoded",
		strings.NewReader("qqq=aaa"))  

	if err != nil {        
		log.Fatal(err)    
	}    
	defer  resp.Body.Close()    
		
	body, err := ioutil.ReadAll(resp.Body)    
	if err != nil {        
		log.Fatal(err)    
	}   

	///
	//如果返回为json数据则可以进行json解析
	//这里解析为map
	myMap := make(map[string]interface{})
	// json.Unmarshal([]byte(jsonBuf), &m1)
	json.Unmarshal(body, &myMap)
	fmt.Println(myMap)
	
	
	
	fmt.Println(string(body))
}

3发起 PostForm(也属于post请求)
原型
参数:地址、请求参数
不用指定application/x-www-form-urlencoded

func (c *Client) PostForm(url string, data url.Values) (r *Response, err error)
package main
import (    
"io/ioutil"
"fmt"    
"net/http"
"log"
"encoding/json"
"net/url"
)
func main(){  

	resp, err := http.PostForm("http://127.0.0.1:8888/test",
		url.Values{"key1": {"Value1"}, "key2": {"value2"}})  

	if err != nil {        
		log.Fatal(err)    
	}    
	defer  resp.Body.Close()    
		
	body, err := ioutil.ReadAll(resp.Body)    
	if err != nil {        
		log.Fatal(err)    
	}   

	///
	//如果返回为json数据则可以进行json解析
	//这里解析为map
	myMap := make(map[string]interface{})
	// json.Unmarshal([]byte(jsonBuf), &m1)
	json.Unmarshal(body, &myMap)
	fmt.Println(myMap)
	
	
	
	fmt.Println(string(body))
}

4发起Head请求
原型
只有一个参数,就不剧烈了

func (c *Client) Head(url string) (r *Response, err error)

5发起do请求
原型
如果要发起的请求需要设置头参数,cookie之类的数据就用此方法
参数:设置好的请求参数

func (c *Client) Do(req *Request) (resp *Response, err error)  

demo

package main
import (    
"io/ioutil"
"fmt"    
"net/http"

"encoding/json"
"strings"
)
func main(){  

	client := &http.Client{}
 	
 	/
 	///设置一系列请求参数
    req, err := http.NewRequest("POST", "http://127.0.0.1:8888/test", 
    	strings.NewReader("aaa=bbb"))
    if err != nil {
        // 错误处理
    }
    //设置请求类型为参数
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    //设置Cookie头
    req.Header.Set("Cookie", "aaa=bbb")
 
 	//发起请求
    resp, err := client.Do(req)
    ///
    
    
    
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        // handle error
    }   

	///
	//如果返回为json数据则可以进行json解析
	//这里解析为map
	myMap := make(map[string]interface{})
	// json.Unmarshal([]byte(jsonBuf), &m1)
	json.Unmarshal(body, &myMap)
	fmt.Println(myMap)
	
	
	
	fmt.Println(string(body))
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java实现异步批量发送HTTP请求数据至服务端可以采用Java的异步框架,如Spring Boot中的异步机制来实现。 具体实现步骤如下: 1. 引入相关依赖:在pom.xml文件中添加Spring Boot的异步依赖,如下所示: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-async</artifactId> </dependency> ``` 2. 创建异步任务:使用@Async注解创建异步任务,如下所示: ``` @Service public class AsyncService { @Async public CompletableFuture<String> sendHttpRequest(String url, String data) throws Exception { // 创建HttpClient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); // 创建HttpPost对象 HttpPost httpPost = new HttpPost(url); // 设置请求httpPost.setHeader("Content-Type", "application/json"); // 设置请求体 StringEntity entity = new StringEntity(data, "utf-8"); httpPost.setEntity(entity); // 发送请求 CloseableHttpResponse response = httpClient.execute(httpPost); // 处理响应结果 String result = EntityUtils.toString(response.getEntity(), "utf-8"); // 关闭资源 response.close(); httpClient.close(); return CompletableFuture.completedFuture(result); } } ``` 在上述代码中,我们使用@Async注解创建了一个异步任务sendHttpRequest(),该方法用于发送HTTP请求并返回响应结果。 3. 调用异步任务:在需要异步发送HTTP请求的地方,调用异步任务即可,如下所示: ``` @Autowired private AsyncService asyncService; public void sendHttpRequests() throws Exception { List<String> urls = Arrays.asList("http://example.com/api/1", "http://example.com/api/2", "http://example.com/api/3"); List<String> data = Arrays.asList("{\"name\":\"张三\"}", "{\"name\":\"李四\"}", "{\"name\":\"王五\"}"); List<CompletableFuture<String>> futures = new ArrayList<>(); for (int i = 0; i < urls.size(); i++) { CompletableFuture<String> future = asyncService.sendHttpRequest(urls.get(i), data.get(i)); futures.add(future); } CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).join(); List<String> results = futures.stream().map(CompletableFuture::join).collect(Collectors.toList()); // 处理响应结果 // ... } ``` 在上述代码中,我们创建了一个List<CompletableFuture<String>>类型的futures,用于存储异步任务的返回结果。然后,我们循环遍历urls和data,调用异步任务sendHttpRequest()并将返回结果添加到futures列表中。接着,我们使用CompletableFuture.allOf()方法等待所有异步任务执行完毕,然后将所有异步任务的返回结果存储在results列表中,最后对响应结果进行处理。 通过以上步骤,我们就可以实现异步批量发送HTTP请求数据至服务端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值