2014-01-23 2 views
1

Я использую Http-тип FSharpData.Наследовать класс с помощью частного конструктора? Или создать новый модуль?

type Http private() = 
    ...... 
    static member Request(url, ?query, ?headers, ?meth, ?body, ?cookies, ?cookieContainer, ?certificate) = 
    ...... 

Однако, мне нужно расширить статический memeber Request для обработки печенья. Я не могу наследовать класс, поскольку его конструктор является закрытым.

type Web() = 
    inherit Http() // Error 
    override Request 
     let ObSSOCookie = new Cookie() 
     ...... 

Или мне пришлось создать модуль с функциями, вызывающими статические функции-члены? Может ли модуль иметь то же имя Http?

ответ

5

Http типа представляет собой статический класс, потому что без гражданства, так что это не делает смысл наследовать от него. Если вы хотите использовать куки и поддерживать их по запросам, вы можете просто создать CookieContainer и использовать его по запросам:

let cc = CookieContainer() 
Http.RequestString("url1", cookieContainer = cc) 
Http.RequestString("url2", cookieContainer = cc) 

Если вы действительно хотите, вы можете создать оболочку для него, как это:

type HttpWithState() = 
    let cookies = CookieContainer() 

    static member RequestString(url, ?params, ?headers, ...) = 
     Http.RequestString(url, ?params = params, ?headers = headers, ..., cookieContainer = cookies) 

, а затем использовать его как это:

let http = HttpWithState() 
http.RequestString("url1") 
http.RequestString("url2") 

Но вы не получите, что много по сравнению с использованием Http типа непосредственно

+0

Иногда веб-сайт (1) с помощью javascript для установки файлов cookie (2) отвечает на set-cookie с помощью path =/..., затем несколько перенаправлений/местоположений до достижения страницы с этим путем ... – ca9163d9

2

Я не верю, что вы можете унаследовать этот класс - это, вероятно, дизайнерское решение.

Однако, полный путь к этому типу является

FSharp.Net.Http 

так что вы можете создать свой собственный тип в чем-то вроде

ABHttp

, которые могли бы вызвать оригинальные http функции и обеспечить переопределение через этот метод.

2

Вы можете попробовать добавить статический метод расширения для Http класса, если он не нужен доступ к рядовым:

type FSharp.Net.Http with 

    static member RequestWithCookies(...) = ... 
Смежные вопросы