2014-11-25 2 views
1

Я пытаюсь использовать XmlProvider из FSharp.Data, и я столкнулся с меньшей проблемой. API, с которым я работаю, требует, чтобы HTTP-заголовок отправлялся с Accept и Accept-Language. Теперь, если я делаю это ..F # XmlProvider и HTTP-заголовки

let afRequestString url = 
     Http.RequestString(
      url, 
      httpMethod="GET", 
      headers = [ Accept HttpContentTypes.Xml; AcceptLanguage "sv-se,sv" ]) 

Это будет работать нормально, к сожалению, я не могу сделать эту работу непосредственно с XmlProvider как этот type foo = XmlProvider<afRequestString "bar">, и это не будет работать:

let foo = afRequestString "bar" 
type bar = XmlProvider<foo> 

В жалоба от компилятора заключается в том, что Sample, предоставленный XmlProvider, должен быть статическим и постоянным, что для меня немного странно, потому что из того, что я понимаю, let-bindings неизменяемы, поэтому они в природе постоянны. Во всяком случае, единственное, что будет работать, что я обнаружил, что делает это таким образом

File.WriteAllText("foo.xml", afRequestString "foo") |> ignore 
type bar = XmlProvider<"foo.xml"> 

Но это действительно кажется, что чрезмерно сложный способ сделать это. Разве нет более простого способа сделать это?

ответ

2

При использовании поставщика типа XML (и других поставщиков) образец должен быть известен во время компиляции. Это означает, что вы не можете использовать значение, которое является результатом некоторого (более или менее сложного вызова).

Если вам нужно указать такие элементы, как заголовки, чтобы получить образец, то лучшим вариантом является получение файла образца сначала (в некотором роде) и сохранение его в локальном файле (или вы можете получить файл как часть ваш скрипт сборки, если вы всегда хотите иметь последнюю версию).

XmlProvider имеет a couple of parameters, задающие, как получить образец, и я подозреваю, что добавление дополнительной настройки для запроса HTTP было бы разумно, но сохранить файл локально, как правило, должны быть достаточно хорошо ...

+0

Да, это то, что я закончил делать. Просто хотел узнать, есть ли более простой способ сделать это или нет. Но тогда у меня была правильная идея, огромное спасибо! –

+2

Другой вариант - отправить PR на F # Data и добавить эту функцию :) –

Смежные вопросы