C# “怎么做?”;获得;请求将页面内容与REST API合并
我是C#的初学者,也是第一次使用RESTAPIC# “怎么做?”;获得;请求将页面内容与REST API合并,c#,azure-functions,httprequest,confluence,confluence-rest-api,C#,Azure Functions,Httprequest,Confluence,Confluence Rest Api,我是C#的初学者,也是第一次使用RESTAPI 我想使用一个带有HTTP触发器的Azure函数,通过RESTAPI“get”从合流页面获取内容 我已在local.settings.json文件中指定了ConfluenceUser、ConfluenceAPI和ConfluenceDomain。 代码(Visual Studio 2019): using Microsoft.Extensions.Configuration; using System; using System.Net.Http;
我想使用一个带有HTTP触发器的Azure函数,通过RESTAPI“get”从合流页面获取内容
我已在
local.settings.json
文件中指定了ConfluenceUser
、ConfluenceAPI
和ConfluenceDomain
。代码(Visual Studio 2019):
using Microsoft.Extensions.Configuration;
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
namespace HttpClientEx
{
class Program
{
private static async Task Main(string[] args)
{
var confBuild = new ConfigurationBuilder()
.AddJsonFile("local.settings.json")
.AddEnvironmentVariables()
.Build();
//Basic Authentication
var user = Encoding.UTF8.GetBytes(confBuild["ConfluenceUser"]);
var api = Encoding.UTF8.GetBytes(confBuild["ConfluenceAPI"]);
var domain = confBuild["ConfluenceDomain"];
string basic_auth = Convert.ToBase64String(user) + ":" + Convert.ToBase64String(api);
string pageid = "1234567";
string page = "https://" + domain + "/wiki/rest/api/content/" + pageid;
}
private static async Task<string> getPageContent(string domain, int pageid, string basic_auth)
{
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", basic_auth);
var response = await client.GetAsync(String.Format("https://" + domain + "/wiki/rest/api/content/" + pageid.ToString() + "?expand=space,metadata.labels"));
var result = await response.Content.ReadAsStringAsync();
return result;
}
}
}
}
使用Microsoft.Extensions.Configuration;
使用制度;
使用System.Net.Http;
使用System.Net.Http.Header;
使用系统文本;
使用System.Threading.Tasks;
命名空间HttpClientEx
{
班级计划
{
专用静态异步任务主(字符串[]args)
{
var confBuild=new ConfigurationBuilder()
.AddJsonFile(“local.settings.json”)
.AddenEnvironmentVariables()
.Build();
//基本身份验证
var user=Encoding.UTF8.GetBytes(confBuild[“ConfluenceUser”]);
var api=Encoding.UTF8.GetBytes(confBuild[“ConfluenceAPI”]);
var domain=confBuild[“ConfluenceDomain”];
string basic_auth=Convert.ToBase64String(用户)+“:”+Convert.ToBase64String(api);
字符串pageid=“1234567”;
string page=“https://“+domain+”/wiki/rest/api/content/”+pageid;
}
私有静态异步任务getPageContent(字符串域、int pageid、字符串基本身份验证)
{
使用(var client=new HttpClient())
{
client.DefaultRequestHeaders.Authorization=newauthenticationheadervalue(“Basic”,Basic\u auth);
var response=await client.GetAsync(String.Format(“https://“+domain+”/wiki/rest/api/content/”+pageid.ToString()+“?expand=space,metadata.labels”);
var result=await response.Content.ReadAsStringAsync();
返回结果;
}
}
}
}
我的问题:我是否正确执行了GET请求
如何查看从Confluence页面获得的内容?如果您想在Azure函数中调用rest API,请参考以下步骤
local.settings.json
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"ConfluenceUser":"",
"ConfluenceAPI":"",
"ConfluenceDomain":""
}
}
b。更新Http.cs中的代码
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
namespace LocalFunctionProj
{
public static class Http
{
private static HttpClient httpClient = new HttpClient();
[FunctionName("Http")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log, ExecutionContext context)
{
log.LogInformation("C# HTTP trigger function processed a request.");
var confBuild = new ConfigurationBuilder()
.SetBasePath(context.FunctionAppDirectory)
.AddJsonFile("local.settings.json")
.AddEnvironmentVariables()
.Build();
//Basic Authentication
var user =confBuild["ConfluenceUser"];
var api = confBuild["ConfluenceAPI"];
var domain = confBuild["ConfluenceDomain"];
httpClient.DefaultRequestHeaders.Authorization= new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", user, api))));
object body = null;
using (HttpResponseMessage response = await httpClient.GetAsync(
$"https://{domain}/wiki/rest/api/content/163979"))
{
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
body = JsonConvert.DeserializeObject(responseBody);
}
return new OkObjectResult(body);
}
}
}
我已删除您的
[visual studio]
标记,因为它是为有关visual studio的问题保留的。如果请求成功,我认为您当前的代码将返回结果。我将添加response.EnsureSuccessStatusCode()
在var response=
和var result=
行之间,这样,如果您正在访问的服务器的状态代码显示调用不成功,则会引发异常。@Pio我假设Azure的函数框架调用了getPageContent
。顺便说一句:它似乎是基本的参数是秘密的,但是允许用户直接指定“域”(实际上可能是他们自己的页面)将允许他们拦截授权头。我不确定这对你来说是否是一个安全问题,但我认为最好还是指出这一点。老实说,最好尝试在你的本地计算机上发出请求,以诊断它的问题。
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
namespace LocalFunctionProj
{
public static class Http
{
private static HttpClient httpClient = new HttpClient();
[FunctionName("Http")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log, ExecutionContext context)
{
log.LogInformation("C# HTTP trigger function processed a request.");
var confBuild = new ConfigurationBuilder()
.SetBasePath(context.FunctionAppDirectory)
.AddJsonFile("local.settings.json")
.AddEnvironmentVariables()
.Build();
//Basic Authentication
var user =confBuild["ConfluenceUser"];
var api = confBuild["ConfluenceAPI"];
var domain = confBuild["ConfluenceDomain"];
httpClient.DefaultRequestHeaders.Authorization= new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", user, api))));
object body = null;
using (HttpResponseMessage response = await httpClient.GetAsync(
$"https://{domain}/wiki/rest/api/content/163979"))
{
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
body = JsonConvert.DeserializeObject(responseBody);
}
return new OkObjectResult(body);
}
}
}
func start