---
id: callwebapi
title: 发现、调用服务
---

## 直接调用

直接调用，则是不使用**任何代理**，直接Call RPC，使用比较简单，**浏览器**也能直接调用实现。

【Url请求】

```scheme
http://127.0.0.1:7789/ApiServer/Sum?a=10&b=20
```

【HttpClient调用】
WebApi的客户端和大家所**熟识**的有一些差距，TouchSocket的WebApi使用的是**先连接**，**后请求**的逻辑。请求时，先标记**GET/POST**的函数。如果是**GET**，则必须**留空URL**，如果是**POST**，则只写URL即可。

```csharp
private static WebApiClient CreateWebApiClient()
{
    WebApiClient client = new WebApiClient();
    client.Setup("127.0.0.1:7789");
    client.Connect();
    Console.WriteLine("连接成功");
    return client;
}
```

```scheme
var client = CreateWebApiClient();

int sum1 = client.Invoke<int>("GET:/ApiServer/Sum?a={0}&b={1}", null, 10, 20);
Console.WriteLine($"Get调用成功，结果：{sum1}");

int sum2 = client.Invoke<int>("POST:/ApiServer/TestPost", null, new MyClass() { A = 10, B = 20 });
Console.WriteLine($"Post调用成功，结果：{sum2}");
```

<a name="rrWhi"></a>

## 代理调用RPC

代理调用的便捷在于，不用再纠结调用的参数类型正不正确，因为这些，代理工具都会替你做好。 <a name="AbsXl"></a>

### 如何生成获取代理文件？

[获取代理文件详情](https://www.yuque.com/eo2w71/rrqm/a13509bfc3581f4576861b690b4a809a) <a name="jsQUz"></a>

### 调用

当代理被客户端获取以后，客户端项目中会多出一个**RRQMProxy**的文件（或者如果是服务器生成的本地代理，则需要复制到客户端项目中），在该文件中，则包含了所有的**代理方法**和**代理类**，可直接由代理类发起调用。


```csharp
int sum3 = client.TestPost(new MyClass() { A = 10, B = 20 });
Console.WriteLine($"代理调用成功，结果：{sum3}");
```
