【问题标题】:How do I parse name-value pairs from the set-cookie header?如何从 set-cookie 标头解析名称-值对?
【发布时间】:2013-03-22 19:43:54
【问题描述】:

我正在寻找一种干净的方法来从 httpwebrequest 对象的 set-cookie 标头中解析出 2 个变量。

Set-Cookie 头中的字符串如下:

X-Mapping-dmogknml=6652DD088AB10EE6A65DD9C700872364;
path=/,ASP.NET_SessionId=f4jg1h55eoqbdk452blsozfl; path=/;
HttpOnly,id=111,status=rejected; expires=Thu, 21-Mar-2013 07:31:55 GMT; path=/,statusDes=
Validation Failed ; expires=Thu, 21-Mar-2013 07:31:55 GMT; path=/,X-Mapping
dmogknml=dmogknml=6652DD088AB10EE6A65DD9C700872; path=/

我基本上想将“status=rejected”中的“rejected”和“statusDes=Validation Failed”中的“validation failed”解析为 2 个字符串变量。我已经在脑海中制定了 2 个解决方案,但它们看起来有点笨拙:

  1. 在“;”上循环和拆分,然后在“,”上拆分,然后在“=”上拆分。
  2. 使用子字符串。

请指教。

【问题讨论】:

  • 感谢您的回答!但是,我应该问的问题是“为什么没有填充 response.Cookies() 对象?”我从另一个问题中发现,你必须初始化请求的 CookieContainer,现在我可以简单地通过使用来访问这些变量:req.Cookies("status") 和 req.Cookies("statusDes")

标签: c# .net vb.net string parsing


【解决方案1】:

您可以使用Split 的重载,它采用Char 的集合。

 var values = theCookie.Split(new [] {';', ',', '='}, 
                              StringSplitOptions.RemoveEmptyEntries);

然后,您可以一次遍历两个 values,查找获取值的键,或者您可以先转换为字典(使用 LINQ ToDictionary)。

【讨论】:

  • 呃。我是个白痴……我弄清楚了我真正的问题是什么。我没有在请求对象上初始化 CookieContainer,这就是为什么我不能使用 req.Cookies() 提取这些值的原因。然而,这是一个很好的替代解决方案。谢谢!
  • 请注意,',' 也会拆分过期时间戳。您可以通过使用带有“,(?=[^ ])”的 Regex.Split 来分隔不同的 cookie 来解决此问题。
【解决方案2】:

尝试使用Regular Expressions

应该这样做(VB代码):

Dim Pattern As String = "status=(?<Status>.*?);.*?statusDes=(?<StatusDes>.*?);"
Dim m As Match = Regex.Match(input:=MyData, pattern:=Pattern , options:=RegexOptions.IgnoreCase + RegexOptions.Singleline)
Dim Status as String
Dim StatusDes as String

    Status = m.Groups("Status").ToString
    StatusDes = m.Groups("StatusDes").ToString

记得导入Imports System.Text.RegularExpressions

希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 2019-07-04
    • 2016-07-19
    • 1970-01-01
    • 2023-03-14
    • 2011-03-13
    • 1970-01-01
    相关资源
    最近更新 更多