Как зарегистрировать обратный вызов JavaScript в Апплете Java?

Вы должны передать действительные имя пользователя и пароль SharePoint Online, чтобы получить значение дайджеста формы и использовать это значение дайджеста в заголовке запроса, а не ноль в фрагменте кода. Вот пример кода для вашей справки:

SPHttpClient.cs и SPHttpClientHandler.cs:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;

    namespace SPORestConsole
    {
        public class SPHttpClient: HttpClient
        {
            public SPHttpClient(Uri webUri, string userName, string password) : base(new SPHttpClientHandler(webUri, userName, password))
            {
                BaseAddress = webUri;
            }
            /// 
            /// Execure request method
            /// 
            /// 
            /// 
            /// 
            /// 
            /// 
            public JObject ExecuteJson(string requestUri, HttpMethod method, IDictionary headers, T payload)
            {
                HttpResponseMessage response;
                switch (method.Method)
                {
                    case "POST":
                        var requestContent = new StringContent(JsonConvert.SerializeObject(payload));
                        requestContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json;odata=verbose");
                        DefaultRequestHeaders.Add("X-RequestDigest", RequestFormDigest());
                        if (headers != null)
                        {
                            foreach (var header in headers)
                            {
                                DefaultRequestHeaders.Add(header.Key, header.Value);
                            }
                        }
                        response = PostAsync(requestUri, requestContent).Result;
                        break;
                    case "GET":
                        response = GetAsync(requestUri).Result;
                        break;
                    default:
                        throw new NotSupportedException(string.Format("Method {0} is not supported", method.Method));
                }

                response.EnsureSuccessStatusCode();
                var responseContent = response.Content.ReadAsStringAsync().Result;
                return String.IsNullOrEmpty(responseContent) ? new JObject() : JObject.Parse(responseContent);
            }

            public JObject ExecuteJson(string requestUri, HttpMethod method, T payload)
            {
                return ExecuteJson(requestUri, method, null, payload);
            }

            public JObject ExecuteJson(string requestUri)
            {
                return ExecuteJson(requestUri, HttpMethod.Get, null, default(string));
            }


            /// 
            /// Request Form Digest
            /// 
            /// 
            public string RequestFormDigest()
            {
                var endpointUrl = string.Format("{0}/_api/contextinfo", BaseAddress);
                var result = this.PostAsync(endpointUrl, new StringContent(string.Empty)).Result;
                result.EnsureSuccessStatusCode();
                var content = result.Content.ReadAsStringAsync().Result;
                var contentJson = JObject.Parse(content);
                return contentJson["d"]["GetContextWebInformation"]["FormDigestValue"].ToString();
            }
        }
    }


    using System;
    using System.Net;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Security;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.SharePoint.Client;

    namespace SPORestConsole
    {
        public class SPHttpClientHandler : HttpClientHandler
        {
            public SPHttpClientHandler(Uri webUri, string userName, string password)
            {
                CookieContainer = GetAuthCookies(webUri, userName, password);
                FormatType = FormatType.JsonVerbose;
            }


            protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
            {
                request.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
                if (FormatType == FormatType.JsonVerbose)
                {
                    //request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json;odata=verbose"));
                    request.Headers.Add("Accept", "application/json;odata=verbose");
                }
                return base.SendAsync(request, cancellationToken);
            }


            /// 
            /// Retrieve SPO Auth Cookies 
            /// 
            /// 
            /// 
            /// 
            /// 
            private static CookieContainer GetAuthCookies(Uri webUri, string userName, string password)
            {
                var securePassword = new SecureString();
                foreach (var c in password) { securePassword.AppendChar(c); }
                var credentials = new SharePointOnlineCredentials(userName, securePassword);
                var authCookie = credentials.GetAuthenticationCookie(webUri);
                var cookieContainer = new CookieContainer();
                cookieContainer.SetCookies(webUri, authCookie);
                return cookieContainer;
            }


            public FormatType FormatType { get; set; }
        }

        public enum FormatType
        {
            JsonVerbose,
            Xml
        }
    }

действие элемента списка обновления вызовов выглядит следующим образом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Headers;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace SPORestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri ("https://tenantname.sharepoint.com/sites/dev/");
            using (var client = new SPHttpClient(uri, "username@tanantname.onmicrosoft.com", "yourpassword"))
            {
                var listTitle = "MyList8";
                var itemId = 4;
                var itemPayload = new { __metadata = new { type = "SP.Data.MyList8ListItem" }, Title = "updateviaRest" };
                var endpointUrl = string.Format("{0}/_api/web/lists/getbytitle('{1}')/items({2})", uri, listTitle, itemId);
                var headers = new Dictionary();
                headers["IF-MATCH"] = "*";
                headers["X-HTTP-Method"] = "MERGE";
                client.ExecuteJson(endpointUrl, HttpMethod.Post, headers, itemPayload);
                Console.WriteLine("Task item has been updated");
            }
        }
    }
}

[ 112] enter image description here

Ссылка:

Использование службы REST SharePoint Online с использованием .NET

10
задан Tader 17 November 2008 в 14:12
поделиться

2 ответа

Я являюсь совершенно новым к Java <-> коммуникация JavaScript, когда я запланировал исследовать его на этой неделе. Хорошая возможность здесь... :-)

После некоторых тестов кажется, что Вы не можете передать функцию JS апплету Java. Если я не делаю его неправильный путь...

Я попробовал:

function CallJava()
{
  document.Applet.Call("Does it work?");
  document.Applet.Call(function () { alert("It works!"); });
  document.Applet.Call(DoSomething); // A simple parameterless JS function
  document.Applet.Call(window.location);
}
function DumbTest(message, value)
{
  alert("This is a dumb test with a message:\n" + message + "\n" + value);
}

где Вызов определяются как:

public void Call(String message)
{
  JSObject win = (JSObject) JSObject.getWindow(this);
  String[] arguments = { "Call with String", message };
  win.call("DumbTest", arguments);
}

public void Call(JSObject jso)
{
  JSObject win = (JSObject) JSObject.getWindow(this);
  String[] arguments = { "Call with JSObject", jso.toString() };
  win.call("DumbTest", arguments);
}

Когда я передаю функцию JS (все тесты в FF3), я получаю пустой указатель на стороне Java.

Обратите внимание, что следующая стандартная программа Java позволяет отображать код JS функции DumberTest!

public int Do()
{
  JSObject win = (JSObject) JSObject.getWindow(this);
  JSObject doc = (JSObject) win.getMember("document");
  JSObject fun = (JSObject) win.getMember("DumberTest");
  JSObject loc = (JSObject) doc.getMember("location");
  String href = (String) loc.getMember("href");
  String[] arguments = { href, fun.toString() };
  win.call("DumbTest", arguments);
  return fun.toString().length();
}

К точке: Я сделал функцию JS:

function RegisterCallback(cbFunction)
{
  var callback = cbFunction.toString(); // We get JS code
  var callbackName = /^function (\w+)\(/.exec(callback);
  document.Applet.RegisterCallback(callbackName[1]);
}

Я извлекаю название функции JS от результата toString и передаю его апплету Java. Я не думаю, что мы можем обработать анонимные функции, потому что Java зовет функции JS по имени.

Сторона Java:

String callbackFunction;
public void RegisterCallback(String functionName)
{
  callbackFunction = functionName;
}
void UseCallbackFunction()
{
    if (callbackFunction == null) return;
    JSObject win = (JSObject) JSObject.getWindow(this);
    win.call(callbackFunction, null);
}
2
ответ дан 4 December 2019 в 02:52
поделиться

win.eval () назовет предопределенный JavaScript.

String callbackFunction;
public void RegisterCallback(String functionName)
{
  callbackFunction = functionName;
}
void UseCallbackFunction()
{
    if (callbackFunction == null) return;
    JSObject win = (JSObject) JSObject.getWindow(this);
    win.eval(callbackFunction);
}
1
ответ дан 4 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: