.net C#:CommandLineParser如何解析URL?[duplicate]

kx7yvsdv  于 2023-02-17  发布在  .NET
关注(0)|答案(3)|浏览(175)
    • 此问题在此处已有答案**:

(17个答案)
2天前关闭。
我正在做一个C#项目,基本上是用命令来执行某些操作。它使用CommandLineParser库来解析所有这些命令和相应的参数。
根据新的业务需求,我需要解析一个包含动词和参数的URL。

    • 是否有任何内置/简单的方法来解析CommandLineParser库中的URL**,这将避免编写我在下面的方法中解释的自定义逻辑?

以下是我解决这一挑战的方法:

    • 将URL转换为命令,然后使用CommandLine分析器为选项属性赋值。**

例如:
网址:

https://localhost:9000/Open?appId=123&appName=paint&uId=511a3434-37e0-4600-ab09-65728ac4d8fe
  • 执行情况:*
  • 将url转换为命令的自定义逻辑
open -appId 123 -name paint -uid 511a3434-37e0-4600-ab09-65728ac4d8fe
  • 然后将其传递给parser.ParseArguments
  • 下面是类结构
[Verb("open", HelpText = "Open an application")]
public class OpenOptions
{
    [Option("id", "appId", Required = false, HelpText = "Application Id")]
    public int ApplicationId{ get; set; }
    [Option("name", "appName", Required = false, HelpText = "Application Name")]
    public string ApplicationName{ get; set; }
    [Option("uId", "userId", Required = true, HelpText = "User Id")]
    public Guid UserId{ get; set; }
}
blpfk2vs

blpfk2vs1#

没有现成的解决方案,通常HttpUtility类(ref Get URL parameters from a string in .NET)就可以解决这个问题。
下面是第一种方法:

var url = "https://localhost:9000/Open?appId=123&appName=paint&uId=511a3434-37e0-4600-ab09-65728ac4d8fe";
Uri uri = new Uri(url);
var @params = HttpUtility.ParseQueryString(uri.Query);
string? appId = @params.Get("appId");
Console.WriteLine(appId);

将返回123,其他参数也是如此。
返回的值将是string类型。您最终可以使用Guid.TryParse来解析Guid对象,使用int.TryParse来解析int值。

qojgxg4l

qojgxg4l2#

CommandLineParser不是为解析URI而设计的,但是使用Uri类和Linq,这是相当容易的:

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var (verb, query) = ParseUri("https://localhost:9000/Open/appId=123&appName=paint&uId=511a3434-37e0-4600-ab09-65728ac4d8fe");

        var appId = query["appId"];
        var appName = query["appName"];
        var uId = query["uId"];

        Console.WriteLine($"verb='{verb}'");
        Console.WriteLine($"appId='{appId}', appName='{appName}', uId='{uId}'");
    }

    static (string verb, Dictionary<string, string> args) ParseUri(string strUri)
    {
        var uri = new Uri(strUri);

        // get the verb
        var verb = uri.Segments[1].TrimEnd('/');

        // get the query part as dictionary
        var args = uri.Segments[2].Split('&')
            .Select(s => s.Split('=')).ToDictionary(d => d[0], d => d[1]);

        return (verb, args);    
    }

}

首先解析一个允许使用Segments属性的URI,然后使用&拆分查询,最后使用=拆分键/值对创建一个字典。
由于queryDictionary,因此您可以简单地访问各个查询参数,例如:

var appId = query["appId"];
var appName = query["appName"];
var uId = query["uId"];

Console.WriteLine($"verb='{verb}'");
Console.WriteLine($"appId='{appId}', appName='{appName}', uId='{uId}'");

其打印:
动词="打开"
应用程序ID ="123",应用程序名称="油漆",用户ID ="511a3434 - 37e0 - 4600-ab09 - 65728ac4d8fe"

    • 注意:**在LinqPad中,您可以使用query.Dump(verb);来可视化结果:

7cwmlq89

7cwmlq893#

var link = "https://localhost:9000/Open?appId=123&appName=paint&uId=511a3434-37e0-4600-ab09-65728ac4d8fe";

var uri = new Uri(link);
var command = uri.LocalPath.TrimStart('/').ToLower();
var query = HttpUtility.ParseQueryString(uri.Query);

var sb = new StringBuilder($"{command} ");
foreach(string key in query)
{
    sb.Append($"-{key} {query.Get(key)} ");
}

var commandWithArgs = sb.ToString();

相关问题