|
On 17 Sep 2012 13:36, "Martin Heller" <mr_heller@yahoo.dk> wrote:
>
>
> I am attempting to write my first lua script with the aim of retrieving some data from a SharePoint list using the GetListItems operation from the build-in Lists.asmx web service.
>
> Googleing led me to LuaSocket and I think, that the script below succedes in sending my request to the SharePoint web service but the response seems to indicate that I need NTLM authorization in order to get the data that I want.
>
> Is it possible to use NTLM authorization with LuaSocket or are there other ways to to set up authentication. I have tried to add "user:pass@" in the ULR, but this did not change the response from the SharePoint site.
>
> Is LuaSocket the correct choice for communicating with a SharePoint web service or should I be looking at something else entirely?
>
> Here is my lua script:
>
> -- Get data from SharePoint site
> local http = require("socket.http")
> local ltn12 = require("ltn12")
> local io = require("io")
>
> local body = [[
> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:soap1="http://schemas.microsoft.com/sharepoint/soap/">
> <soap:Header/>
> <soap:Body>
> <soap1:GetListItems>
> <soap1:listName>MyListName</soap1:listName>
> <soap1:viewName>MyViewName</soap1:viewName>
> <soap1:query>
> <Query><Where><Eq><FieldRef Name='Field'/><Value Type='Number'> 1234 </Value></Eq></Where></Query>
> </soap1:query>
> <soap1:viewFields>
> <ViewFields><FieldRef Name='ID' /><FieldRef Name='Field' /></ViewFields>
> </soap1:viewFields>
> </soap1:GetListItems>
> </soap:Body>
> </soap:Envelope>
> ]]
>
>
> r, c, h = http.request {
> url = "" href="http://my/sharepoint/site/_vti_bin/lists.asmx">http://my/sharepoint/site/_vti_bin/lists.asmx",
> method = "POST",
> sink = ltn12.sink.file(io.stdout),
> source = ltn12.source.string(body),
> headers = {
> ["Content-Length"] = tostring(body:len()),
> ["Content-Type"] = "application/soap+xml;charset=UTF-8",
> ["SOAPAction"] = "\"http://schemas.microsoft.com/sharepoint/soap/GetListItems\"",
> ["Connection"] = "Keep-Alive",
> }
> }
>
>
> -- Copied from http://lua-users.org/wiki/TableSerialization
> -- Print anything - including nested tables
> function table_print (tt, indent, done)
> done = done or {}
> indent = indent or 0
> if type(tt) == "table" then
> for key, value in pairs (tt) do
> io.write(string.rep (" ", indent)) -- indent it
> if type (value) == "table" and not done [value] then
> done [value] = true
> io.write(string.format("[%s] => table\n", tostring (key)));
> io.write(string.rep (" ", indent+4)) -- indent it
> io.write("(\n");
> table_print (value, indent + 7, done)
> io.write(string.rep (" ", indent+4)) -- indent it
> io.write(")\n");
> else
> io.write(string.format("[%s] => %s\n",
> tostring (key), tostring(value)))
> end
> end
> else
> io.write(tt .. "\n")
> end
> end
>
> print(r)
> print(c)
> table_print(h,2,false)
>
> -- End of script
>
> Running my script yields:
>
> 1
> 401
> [microsoftsharepointteamservices] => 12.0.0.6421
> [www-authenticate] => NTLM
> [date] => Mon, 17 Sep 2012 12:05:16 GMT
> [x-powered-by] => ASP.NET
> [content-length] => 0
> [server] => Microsoft-IIS/7.0
>
>
> I can successfully send the same request to the SharePoint site using soapUI and in return I get the following headers:
>
> MicrosoftSharePointTeamServices 12.0.0.6421
> Content-Length 697
> #status# HTTP/1.1 200 OK
> Set-Cookie WSS_KeepSessionAuthenticated=80; path=/
> Server Microsoft-IIS/7.0
> X-Powered-By ASP.NET
> Cache-Control private, max-age=0
> X-AspNet-Version 2.0.50727
> Vary Accept-Encoding
> Date Mon, 17 Sep 2012 11:52:24 GMT
> Content-Encoding gzip
> Content-Type application/soap+xml; charset=utf-8
>
> and a soap:Envelope containing the response data.
>
>
>
Unfortunately NTLM authentication is not widely supported, and you do generally need it for SharePoint. I would look for something that does have support first and use that. I seem to remember you can get curl support to work so you could use a curl binding.
Justin