GVKun编程网logo

Golang实现web api接口调用及web数据抓取[get post模式](golang调用http接口)

15

这篇文章主要围绕Golang实现webapi接口调用及web数据抓取[getpost模式]和golang调用http接口展开,旨在为您提供一份详细的参考资料。我们将全面介绍Golang实现webapi

这篇文章主要围绕Golang实现web api接口调用及web数据抓取[get post模式]golang调用http接口展开,旨在为您提供一份详细的参考资料。我们将全面介绍Golang实现web api接口调用及web数据抓取[get post模式]的优缺点,解答golang调用http接口的相关问题,同时也会为您带来Angular+golang+postgres+docker实现web聊天+用户管理之Angular、ASP.NET Web API 2系列(三):查看WebAPI接口的详细说明及测试接口、c# 【MVC】WebApi通过HttpClient来调用Web Api接口、golang 怎么实现websocket的实用方法。

本文目录一览:

Golang实现web api接口调用及web数据抓取[get post模式](golang调用http接口)

Golang实现web api接口调用及web数据抓取[get post模式](golang调用http接口)

前沿:

继续扩展我的golang服务端,这边有些数据库是没有权限的,对方给了我webservices的接口,针对异常的数据,我要去抓数据,再次分析,golang貌似没有python那么多的模拟浏览器访问的模块,还好默认的http就支持。 功能一点都不必urllib2 差。。。



正题!!! 这里是通过golang提供的net/http模块, http.NewRequest来进行数据抓取。 他能实现python下的urllib2的功能 !


原文:http://rfyiamcool.blog.51cto.com/1030776/1384473


原理不多说了,大家直接套用这两个get post的例子吧。


可以任意的加header头,比如怎么加一个浏览器的标识 !

client := &http.Client{]
req,err := http.NewRequest("POST","http://127.0.0.1",bytes.NewReader(postData))
req.Header.Add("User-Agent","无敌浏览器")
resp,err := client.Do(req)
defer resp.Body.Close()


下面是完整的例子,可以加更多的Header


#http://xiaorui.cc
package main
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
import (
    "net/http"
    "io/IoUtil"
    "fmt"
    "net/url"
)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
func main() {
    client := &http.Client{}
    reqest,_ := http.NewRequest("GET","http://127.0.0.1/",nil)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
    reqest.Header.Set("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
    reqest.Header.Set("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.3")
    reqest.Header.Set("Accept-Encoding","gzip,deflate,sdch")
    reqest.Header.Set("Accept-Language","zh-CN,zh;q=0.8")
    reqest.Header.Set("Cache-Control","max-age=0")
    reqest.Header.Set("Connection","keep-alive")
    reqest.Header.Set("User-Agent","chrome 100")
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
    response,_ := client.Do(reqest)
    if response.StatusCode == 200 {
        body,_ := IoUtil.ReadAll(response.Body)
        bodystr := string(body);
        fmt.Println(bodystr)
    }
//  reqest,_ = http.NewRequest("POST","http:/127.0.0.1/",bytes.NewBufferString(data.Encode()))
/    respet1,_ := http.NewRequest("POST",url.Values{"key":"Value"})
//    reqest1.Header.Set("User-Agent","chrome 100")
//    client.Do(reqest1)
}


我们再来测试下 post获取数据 !


#http://xiaorui.cc
package main
import(
         "fmt"
         "net/http"
         "net/url"
         "io/IoUtil"
 )
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
func main(){
        get()
        post()
}
 func get(){
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
         response,_:=http.Get("http://127.0.0.1/")
         defer response.Body.Close()
         body,_:=IoUtil.ReadAll(response.Body)
         fmt.Println(string(body))
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
         if response.StatusCode == 200 {=
                 fmt.Println("ok")
         }else{
                 fmt.Println("error")
         }
 }
 func post(){
         //resp,err :=
         http.PostForm("http://127.0.0.1",url.Values{"name": {"ruifengyun"},"blog": {"xiaorui.cc"},"aihao":{"python golang"},"content":{"nima,fuck "}})
 }



我们用http加上golang的runtime可以搞成类似 ab的压力测试工具,我昨天写了一个版本,但是在压倒3k以上的链接数的时候,会出现不少的error,原因可能是linux本身没有做tcp的优化,获取是对端的tornado没有用@gen,所以效率跟不上去,我的压力程序没有做defer panic处理。 今天看了下 golang的 gb压力测试工具,发现主要的思路是相同的,但是很多的细节没有做处理,比如channel的同步是用那种for <-c 的土方法实现的。


我的程序是有问题,但是老外有大牛已经构建了一套类似ab的工具,性能差不多,但是这个支持更多的选项和参数,包括代理,基本认证,请求头header信息,长链接,post,gzip压缩,开启几个cpu核心,cookie的插入。


go get github.com/parkghost/gohttpbench
go build -o gb github.com/parkghost/gohttpbench


用golang实现的搞并发的压力测试工具 !

原文:xiaoruicc

-A="": Add Basic WWW Authentication,the attributes are a colon separated username and password.

-C=[]: Add cookie,eg. 'Apache=1234. (repeatable)

-G=4: Number of cpu

-H=[]: Add Arbitrary header line,eg. 'Accept-Encoding: gzip' Inserted after all normal header lines. (r

epeatable)

-T="text/plain": Content-type header for POSTing,eg. 'application/x-www-form-urlencoded' Default is 'te

xt/plain'

-c=1: Number of multiple requests to make

-h=false: display usage information (this message)

-i=false: Use HEAD instead of GET

-k=false: Use HTTP KeepAlive feature

-n=1: Number of requests to perform

-p="": File containing data to POST. Remember also to set -T

-r=false: Don't exit when errors

-t=0: Seconds to max. wait for responses

-u="": File containing data to PUT. Remember also to set -T

-v=0: How much troubleshooting info to print

-z=false: Use HTTP Gzip feature


wKiom1MybG7Q9OCWAAgXzjPTBo0978.jpg


具体的用法:

wKiom1MybJyxPy2CAAUE_hjCdcE841.jpg


咱们在看看Nginx服务端的日志情况:

wKiom1MybvfyFxAyABD8hLgjayk480.jpg

Angular+golang+postgres+docker实现web聊天+用户管理之Angular

Angular+golang+postgres+docker实现web聊天+用户管理之Angular

#一、博客分批

  • 需求+总结
  • Golang
  • Postgresql
  • Docker

<br>

#二、命令

1、创建项目

ng new myangularproject

<br> 第一个选择:是否添加路由,基本上所有项目都需要路由,输入 **y**

<br> 第二个选择:选择样式,通常都是 **scss**

<br> 运行这里的时候在安装依赖,会很慢,选择 **ctrl+c** 取消安装

<br> 进入项目文件夹

cd myangularproject

<br> 用 **cnpm i** 或 **npm i** 安装依赖( **cnpm** 是淘宝的镜像,速度会快很多,但是我不知道为什么用不了,所以这里还是用 **npm i** )

安装完依赖后,项目的创建就完成了

<br> 2、运行项目

ng serve

显示运行成功后,浏览器输入 localhost:4200 即可访问

<br>

3、创建组件

ng g component components/first

<br>

最后为目录,表示在 app 文件夹下新建 components 文件夹,并在 components 文件夹下创建名称为 first 的组件

组件用于数据的展示

<br>

4、创建服务

ng g service services/myservice

<br>

最后为目录,表示在 app 文件夹下新建 services 文件夹,并在 services 文件夹下创建名称为 services 的服务

服务用于获取数据

<br>

5、编辑成静态文件

ng build

<br>

在给定的输出路径下,将 Angular 应用编译到名为 dist 的输出目录中。必须从工作空间目录中执行。

<br>

#三、路由跳转

<br>

ts文件中使用路由,先引入再声明初始化

<br>

1、ts带参数跳转

<br>

2、ts不带参跳转

<br>

3、html跳转

<br>

#四、总结

  1. 其实我也不知道这个博客要记录一些什么,毕竟都是根据题目要求写的代码,没有什么难度,感觉就是在积累代码量和熟悉一下代码;
  2. 难度基本上都在于刚接触 Angular 和不懂得开发流程,在前期用了很多时间去搞懂;
  3. 唯一一个有难度的功能就是未读消息的红点提示,其实就是一个逻辑判断,但是有点绕,需要结合不同情况判断出不出现红点;
  4. 因为第一次做,老师也没有给到规范要求,一些数据格式、接口调用没有很正式,都是和后端连通就完事了。
  5. 所以这份博客就总结一下 Angular 常用的那些命令和功能。

ASP.NET Web API 2系列(三):查看WebAPI接口的详细说明及测试接口

ASP.NET Web API 2系列(三):查看WebAPI接口的详细说明及测试接口

引言

前边两篇博客介绍了Web API的基本框架以及路由配置,这篇博客主要解决在前后端分离项目中,为前端人员提供详细接口说明的问题,主要是通过修改WebApi HelpPage相关代码和添加WebApiTestClient组件实现WebAPI接口详细说明以及接口测试。

WepAPI系列博客

ASP.NET Web API 2系列(一):初识Web API及手动搭建基本框架

ASP.NET Web API 2系列(二):灵活多样的路由配置

WebApi HelpPage帮助页

通过VS2017创建Web API应用程序(注意不是空的API应用程序),系统会自动添加HelpPage,这里通过修改代码和设置路径,可以实时查看WebAPI的接口说明。

创建Web API应用程序

新建WebAPITest解决方案,并添加WebAPITest.Web(Web API应用程序)和WebAPI.Entities(类库),创建过程可以到系列博客查看,创建完成,解决方案资源管理器如下图所示:

在Entities中添加Student类,并在Controllers中添加StudentController(Web API控制器类(V2.1)),修改相应代码(具体参照ASP.NET Web API 2系列(二):灵活多样的路由配置),删除原有的ValueController,上述操作完成后如下图所示:

 运行程序,点击页面中API菜单(http://localhost:56783/Help),可以看到API接口,如下图所示:

 点击上边列表中的接口,可以查看调用说明,如下图所示:

 这时发现所有的说明信息都为空(Description),接下来添加描述信息。

HelpPage显示description

Student.cs中的相应字段和StudentController.cs中的接口添加描述信息,如下图所示:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 分别勾选WebAPITest.Entities和WebAPITest.Web项目【属性-生成-输出-XML文档文件】,如下图所示:

修改Areas/HelpPage/App_Start/HelpPageConfig.cs

修改 public static void Register(HttpConfiguration config):

config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/bin")));

输出目录都设置到Web的bin下,具体截图如下:

修改Areas/HelpPage/XmlDocumentationProvider.cs

添加私有变量:

private List<XPathNavigator> _documentNavigators;

修改构造函数 public XmlDocumentationProvider(string documentPath)(其中的files种的XML名字必须和生成的对应):

public XmlDocumentationProvider(string documentPath)
        {
            if (documentPath == null)
            {
                throw new ArgumentNullException("documentPath");
            }
            //XPathDocument xpath = new XPathDocument(documentPath);
            //_documentNavigator = xpath.CreateNavigator();
            _documentNavigators = new List<XPathNavigator>();
            var files = new[] { "WebAPITest.Web.xml", "WebAPITest.Entities.xml" };
            foreach (var file in files)
            {
                var path = Path.Combine(documentPath, file);
                if (File.Exists(path))
                {
                    XPathDocument xpath = new XPathDocument(path);
                    _documentNavigators.Add(xpath.CreateNavigator());
                }
            }
        }

添加私有方法:

private XPathNavigator SelectSingleNode(string selectExpression)
        {
            foreach (var navigator in _documentNavigators)
            {
                var propertyNode = navigator.SelectSingleNode(selectExpression);
                if (propertyNode != null)
                    return propertyNode;
            }
            return null;
        }

用SelectSingleNode(selectExpression)替换_documentNavigator.SelectSingleNode(selectExpression)的调用,在文中大概有四处。

 此时完成添加描述的全部操作,运行程序,效果如下图所示:

 WebApiTestClient接口测试

 WebApiTestClient介绍

WebApiTestClient组件作用主要有以下几个:

(1)将WebApi的接口放到了浏览器里面,以可视化的方式展现出来,比如我们通过http://localhost:11095/Help这个地址就能在浏览器里面看到这个服务里面所有的API接口以及接口的详细说明。

(2)能够详细查看API的类说明、方法说明、参数说明、返回值说明。只需要我们在定义方法时候加上 /// 这种详细注释即可,组件自动读取注释里面的内容展现在界面上面。

(3)可以修改http请求头文件Head和请求体Body里面的参数,指定发送http请求的特性,比如指定我们最常见的contentType指示参数的类型。

(4)组件拥有测试接口的功能,用过Soup UI的朋友应该知道,通过Soup UI能够方便测试WebService参数以及返回值。我们的WebApiTestClient也可以实现类似的功能,直接通过页面上的测试按钮,就能测试接口。

安装 WebApiTestClient组件

通过NuGet引入组件,如下图所示:

 

安装成功后,项目会自动添加一些主要文件:

Scripts\WebApiTestClient.js
Areas\HelpPage\TestClient.css
Areas\HelpPage\Views\Help\DisplayTemplates\TestClientDialogs.cshtml
Areas\HelpPage\Views\Help\DisplayTemplates\TestClientReferences.cshtml

组件使用

修改Areas/HelpPage/Views/Help/Api.cshtml,添加以下内容:

@Html.DisplayForModel("TestClientDialogs")
@section Scripts{
    <link href="~/Areas/HelpPage/HelpPage.css" rel="stylesheet" />
    @Html.DisplayForModel("TestClientReferences")
}

添加位置如下图所示:

 添加完成后,运行程序,调用api/Student/{id},此时发现在页面右下角出现一个【Test API】按钮,如下图所示:

单击【Test API】按钮,可以直接测试次API接口,具体调用后边再讲,此时发现测试页面在当前页面的最下端,不太美观,如下图所示:

研究发现,出现该问题的原因是由于新建的项目自带的JQuery和Boostrap的版本过高引起,通过NuGet将JQuery修改为1.12.4,Boostrap修改为3.3.7。在此运行程序,测试页面出现页面中间,如下所示:

 

输出调用参数001,点击【Send】按钮,测试api/Student/{id},调用结果如下图所示:

 其他接口都可以通过此方法调用测试,非常的直观、便捷。

总结

至此,完成了关于WebAPI接口查看及测试调动的全部过程,上述操作的环境VS2017和.Net Framework4.6,相关程序代码感兴趣的童鞋也可以直接下载(页面右上角的GitHub)。博文写作不易希望多多支持,后续会更新更多内容,感兴趣的朋友可以加关注,欢迎留言交流!

 

原文出处:https://www.cnblogs.com/aizai846/p/11598634.html

c# 【MVC】WebApi通过HttpClient来调用Web Api接口

c# 【MVC】WebApi通过HttpClient来调用Web Api接口

/// <summary>
/// HttpClient实现Post请求(异步)
/// </summary>
static async void dooPost()
{
	string url = "http://localhost:52824/api/register";
	 //设置HttpClientHandler的AutomaticDecompression
	var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
	//创建HttpClient(注意传入HttpClientHandler)
	using (var http = new HttpClient(handler))
	{
		//使用FormUrlEncodedContent做HttpContent
		var content = new FormUrlEncodedContent(new Dictionary<string, string>()       
		{    {"Id","6"},
			 {"Name","添加zzl"},
			 {"Info", "添加动作"}//键名必须为空
		 });

		//await异步等待回应

		var response = await http.PostAsync(url, content);
		//确保HTTP成功状态值
		response.EnsureSuccessStatusCode();
		//await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)
		Console.WriteLine(await response.Content.ReadAsStringAsync());
	}

}
/// <summary>
/// HttpClient实现Get请求(异步)
/// </summary>
static async void dooGet()
{
	string url = "http://localhost:52824/api/register?id=1";
	//创建HttpClient(注意传入HttpClientHandler)
	var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };

	using (var http = new HttpClient(handler))
	{
		//await异步等待回应
		var response = await http.GetAsync(url);
		//确保HTTP成功状态值
		response.EnsureSuccessStatusCode();

		//await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)
		Console.WriteLine(await response.Content.ReadAsStringAsync());
	}
}
/// <summary>
/// HttpClient实现Put请求(异步)
/// </summary>
static async void dooPut()
{
	var userId = 1;
	string url = "http://localhost:52824/api/register?userid=" + userId;

	//设置HttpClientHandler的AutomaticDecompression
	var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
	//创建HttpClient(注意传入HttpClientHandler)
	using (var http = new HttpClient(handler))
	{
		//使用FormUrlEncodedContent做HttpContent
		var content = new FormUrlEncodedContent(new Dictionary<string, string>()       
		{
		   {"Name","修改zzl"},
		   {"Info", "Put修改动作"}//键名必须为空
		});

		//await异步等待回应

		var response = await http.PutAsync(url, content);
		//确保HTTP成功状态值
		response.EnsureSuccessStatusCode();
		//await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)
		Console.WriteLine(await response.Content.ReadAsStringAsync());
	}
}

golang 怎么实现websocket

golang 怎么实现websocket

在现代前端越来越注重实时和交互性的时代,一种网络通信协议变得更加流行,它就是 websocket。在使用中,websocket 和 http 有一定的相似点,但是与传统的 http 请求不同,websocket 能够实现长时间保持连接。如果你正在考虑使用 websocket 来建立 web 应用程序,那么你可能需要使用一些编程语言来实现它。其中,golang 是一种非常流行的编程语言之一,让我们来了解一下如何在 golang 中实现 websocket。

一、什么是 WebSocket?

WebSocket 是一种在单个 TCP 连接上提供双向通信的网络协议。在传统的 HTTP 协议中,请求从浏览器发送到服务器,服务器进行处理后返回结果给浏览器,这个过程是一次性的,请求处理完成之后,连接就会关闭。而 WebSocket 协议则不同,当浏览器与服务器建立连接后,连接就会一直保持,直到用户或服务器决定关闭连接。这意味着,在连接保持期间,服务器可以随时向客户端发送信息,而不需要等待浏览器发出请求。

二、Golang 实现 WebSocket

Golang 是一种支持并发编程的编程语言,最初由 Google 开发,它的优势在于它的运行效率和内存占用率极低。下面我们将介绍如何使用 Golang 实现 WebSocket。

立即学习“go语言免费学习笔记(深入)”;

  1. 安装 Gorilla WebSocket 库
     Gorilla WebSocket 是一个流行的 WebSocket 库,它提供了简单易用的 API,用于创建和处理 WebSocket 连接。在安装 Gorilla WebSocket 库之前,你需要先安装 Go 环境,Go 安装完成后,使用以下命令即可安装 Gorilla WebSocket 库:

    go get github.com/gorilla/websocket
    登录后复制
  2. 编写代码

下面我们将使用 Go 和 Gorilla WebSocket 库来实现一个简单的聊天室。在我们的聊天室中,用户可以发送消息并查看来自其他用户的消息。以下是实现 WebSocket 聊天室的代码:

package main

import (
    "fmt"
    "log"
    "net/http"
    "github.com/gorilla/websocket"
)

var clients = make(map[*websocket.Conn]bool)
var broadcast = make(chan Message)
var upgrader = websocket.Upgrader{}

// Message struct
type Message struct {
    Username string `json:"username"`
    Body     string `json:"body"`
}

func main() {
    // Configure websocket route
    http.HandleFunc("/ws", handleConnections)

    // Start listening for incoming chat messages
    go handleMessages()

    // Start the server on localhost port 8080 and log any errors
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

func handleConnections(w http.ResponseWriter, r *http.Request) {
    // Upgrade initial GET request to a websocket
    ws, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Fatal(err)
    }
    // Make sure we close the connection when the function returns
    defer ws.Close()

    // Register our new client
    clients[ws] = true

    for {
        var msg Message
        // Read in a new message as JSON and map it to a Message object
        err := ws.ReadJSON(&amp;msg)
        if err != nil {
            log.Printf("error: %v", err)
            delete(clients, ws)
            break
        }
        // Send the newly received message to the broadcast channel
        broadcast <p>代码的主要思想是创建一个 WebSocket 连接并添加到 clients 列表中,任何消息都会被写入到 broadcast 通道中,并在另一个 goroutine 中发送到所有客户端。每个连接通过读取和分配 Message 对象来接收消息。客户端发送消息的示例代码如下:</p><pre>let socket = new WebSocket("ws://localhost:8080/ws");

socket.addEventListener("open", function() {
  socket.send(JSON.stringify({
    "username": "John",
    "body": "Hello World!"
  }));
});

socket.addEventListener("message", function(event) {
  console.log("Received: " + event.data);
});
登录后复制

在这个示例中,我们首先创建一个 WebSocket 对象并将其连接到服务器。在连接成功后,我们发送一个 JSON 作为消息体。服务端发送消息给客户端时,我们需要在客户端的 JavaScript 代码中监听 message 事件,并在收到消息时处理它。

三、总结

WebSocket 提供了一种实时通信的新方式,它为 Web 应用提供了更多互动性和用户体验。使用 Golang 和 Gorilla WebSocket 库可以轻松地实现 WebSocket 连接,并在应用程序中使用 WebSocket 协议。

本文提供了一个简单的聊天室的实现示例,希望对您有所帮助。当然,WebSocket 还可以用于许多其他类型的应用程序,因此请根据您自己的需求进行调整。

以上就是golang 怎么实现websocket的详细内容,更多请关注php中文网其它相关文章!

关于Golang实现web api接口调用及web数据抓取[get post模式]golang调用http接口的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Angular+golang+postgres+docker实现web聊天+用户管理之Angular、ASP.NET Web API 2系列(三):查看WebAPI接口的详细说明及测试接口、c# 【MVC】WebApi通过HttpClient来调用Web Api接口、golang 怎么实现websocket的相关知识,请在本站寻找。

本文标签: