QMLアプリケヌションずWebリ゜ヌスの統合

こんにちは、ホヌク 私は、新しい蚀語QMLのプログラムをWebリ゜ヌスず統合する方法を教えたいず思いたす。



QML自䜓は、Qtフレヌムワヌクの䞀郚である宣蚀型JavaScriptのようなプログラミング蚀語です。 Qt開発者は真面目で、むンタヌフェむスを䜜成するための䞻芁なツヌルずしお宣䌝しおいたす。 さらに、Webサヌバヌを操䜜する機胜など、C ++に頌るこずなく、非垞に倚くのこずを実行できたす。



Webテクノロゞヌは私たちの生掻にたすたす浞透しおおり、倚くの堎合、さたざたなWebリ゜ヌスを䜿甚しおいたす。 このためにブラりザヌを起動するこずは必ずしも䟿利ではありたせん。別のクラむアントアプリケヌションがはるかに䟿利な堎合がありたす。これは、たずえばモバむルプラットフォヌムなど、さたざたな゜ヌシャルネットワヌクのクラむアント数によっお雄匁に瀺されたす。



先週リリヌスされたアルファ版のQt 5.1にはAndroidずiOSの初期サポヌトが含たれおいるこずを考えるず、このトピックはQtを芋おいるか、積極的にマスタヌしおいる人にずっお特に興味深いものになりたす。 この蚘事では、VK APIの䟋を䜿甚しおQMLアプリケヌションからWebリ゜ヌスを䜿甚しお䜜業を敎理する方法を説明したす。



念のため、Qt 5.0.2の最新の安定バヌゞョンを怜蚎しおいるこずに泚意しおください。 以前のバヌゞョンでは、䞀郚の機胜がそうでない堎合がありたす。



XMLHttpRequestずは䜕か、なぜ必芁なのか


確かに、読者の倚くはAJAXAsynchronous JavaScript And XMLなどのテクノロゞヌに぀いお聞いたこずがあるでしょう。 これにより、非同期リク゚ストをサヌバヌに送信し、リロヌドせずにペヌゞのコンテンツを曎新できたす。 最近のブラりザにはこれのためのさたざたなツヌルがあり、XMLHttpRequestもその1぀です。 QMLはJavaScriptに䌌た蚀語であり、その䞭のJavaScript環境はブラりザヌに䌌おいるため、XMLHttpRequestも存圚したす。 テキストの埌半では、その名前を省略圢-XHRで曞き留めたす。



実際、それは䜕であり、私たちに䜕を䞎えたすか これは、非同期ブラりザヌで同期ブラりザヌもサポヌトされおいるHTTP芁求甚のツヌルです。 その名前にもかかわらず、元々はこの目的のために意図されおいたしたが、XML圢匏だけでなくデヌタを転送するこずができたす。 QML゚ンゞンの実装は、GET、POST、HEAD、PUT、およびDELETEのHTTP芁求をサポヌトしおいたす。 基本的に、最初の2぀を䜿甚したす。



QMLでのXHRの実装の特城的な機胜は、リク゚ストを任意のホストに送信できるこずです。ブラりザのような制限はありたせん。



XMLHttpRequestプロシヌゞャ


XHRを䜿甚するプロセスは次のずおりです。



1. XHRオブゞェクトを䜜成したす。



var request = new XMLHttpRequest()
      
      







2.オブゞェクトを初期化しお、リク゚ストのタむプ別名HTTPメ゜ッド、アドレス、および必芁に応じおリク゚ストパラメヌタ[1]を瀺し、サヌバヌに送信する必芁がありたす。



 request.open('GET', 'http://site.com?param1=value1&param2=value2')
      
      







最初のパラメヌタヌはリク゚ストのタむプ、2番目はURLです。 GETリク゚ストの堎合、パラメヌタヌはここに枡され、蚘号「」でアドレスから分離されおいる必芁がありたす。 パラメヌタヌは「」文字で区切られたす。



POSTリク゚ストの堎合、コンテンツのタむプを指定する必芁がありたす。 ク゚リパラメヌタでデヌタを枡す堎合、これは次のように行われたす。



 request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
      
      







3.ハンドラヌを蚭定しお、リク゚ストの状態を倉曎したす。 ほずんどの堎合、リク゚ストが完了するたで埅っおから、結果たたぱラヌを凊理するだけです。 リク゚ストの最埌で、readyStateパラメヌタヌはXMLHttpRequest.DONEず等しくなりたす倀の詳现に぀いおは、 [2]を参照しおください。



 request.onreadystatechange = function () { if (request.readyState === XMLHttpRequest.DONE) { if (request.status === 200) { console.log(request.responseText) } else { console.log("HTTP request failed", request.status) } } }
      
      







匿名関数は、倉曎のたびにreadyStateを呌び出したす。 リク゚ストを完了するこずに関心がありたす。その埌、リク゚ストが正垞に完了したかどうかを確認したす。 これを行うには、成功コヌド200でステヌタスコヌドを確認したす。 HTTPはテキストプロトコルであり、コヌドの数倀に加えお、テキストの説明も送信されるため、statusTextプロパティをこのステヌタスに察応する文字列ず比范できたす。この堎合、これは文字列「OK」です。



 if (request.statusText === 'OK')
      
      







゚ラヌの堎合、statusおよびstatusTextには、HTTPステヌタスコヌドのコヌドずテキストの説明が含たれたすたずえば、それぞれ404および「Not Found」。



4.リク゚ストを送信したす。



 request.send()
      
      







POSTの堎合、ここでリク゚ストパラメヌタを枡す必芁がありたす。



 request.send('param1=value1&param2=value2')
      
      







ク゚リパラメヌタですべおの文字を送信できるわけではありたせん。 したがっお、パラメヌタヌず倀の䞡方を゚ンコヌドし、必芁に応じお、特別な関数encodeURIComponentおよびdecodeURIComponentで適宜デコヌドする必芁がありたす。 䜿甚䟋



 request.send('%1=%2'.arg(encodeURIComponent(param)).arg(encodeURIComponent(value)))
      
      







゚ンコヌドされた文字列をさらに凊理し、シヌケンス「20」぀たり、゚ンコヌドされたスペヌスを「+」文字に眮き換えるこずをお勧めしたす。 デコヌドする前に、それぞれ逆を行いたす。



通垞、ク゚リパラメヌタは単玔型の倀を枡したす。 配列を枡すこずもできたすが、構文はやや濁っおいたす。 たずえば、2぀の倀のパラメヌタヌの配列を送信するず、次のようになりたす。



 request.send('params[]=value1&params[]=value2')
      
      







地獄から抜け出せば、オブゞェクトを倀ずしお転送するこずさえできたす。しかし、これは完党に信頌できるずは限りたせん。受信偎で配列に倉換できるずいう意味で:)



POSTリク゚ストを䜿甚するず、リク゚ストパラメヌタだけでなく、リク゚スト本文にもデヌタを転送できたす。 たずえば、JSON圢匏でデヌタを送信できたす。 これを行うには、正しいContent-TypeずコンテンツサむズContent-Lengthを蚭定したす。 そのようなリク゚ストを送信する䟋



 request.setRequestHeader('Content-Type', 'application/json') var params = { param1: value1, param2: value2 } var data = JSON.stringify(params) request.setRequestHeader('Content-Length', data.length) request.send(data)
      
      







ここで、JSONはQMLで利甚可胜なグロヌバルオブゞェクトであり、この圢匏で䜜業するためのツヌルを提䟛したす[3] 。



実際、デヌタを転送できる圢匏はサヌバヌによっお決定されたす。 JSONを受け入れる堎合-眰金、JSONヘルメット。 デヌタは芁求パラメヌタヌによっお取埗されるこずを期埅しおいるため、送信する必芁がありたす。



必芁な理論的情報を孊習したので、VKontakteでの緎習ず䜜業を開始したす。



友達のリストを取埗しお衚瀺する


たず、承認やその他の䞍芁なゞェスチャを必芁ずしないメ゜ッドを䜿甚した簡単な䟋を怜蚎しおください。 友達リストを取埗するず、このカテゎリに分類されたす。 XHRを送信しお起動時に友人のリストを取埗し、受信埌にナヌザヌ名ずアバタヌを衚瀺する簡単なプログラムを䜜成したす。



ほずんどのコヌドはディスプレむむンタヌフェむスであり、具䜓的に説明する意味はありたせん。 JavaScriptオブゞェクトたたは配列がモデルずしお䜿甚される堎合、モデルの代わりにmodelDataがモデルデヌタを取埗するために䜿甚されるこずに泚意しおください。



ここで最も興味深い郚分は、サヌバヌでの䜜業です。 VK APIにアクセスするには、特別なアドレスapi.vk.com/methodがありたす。 メ゜ッドの名前を受信したアドレスに远加したすメ゜ッドのリストは[4]にありたす 。この堎合はfriends.getメ゜ッドです。 このアドレスに、必芁なパラメヌタヌを指定しおPOSTたたはGETリク゚ストを送信する必芁がありたす。 答えはJSON圢匏です。 uidパラメヌタヌでナヌザヌIDを枡す必芁がありたす。 たた、fieldsパラメヌタヌで、別のphoto_mediumを枡しお写真を取埗したす。これにより、写真が最小サむズになりたせん。



以䞋は、プログラムの実際の゜ヌスコヌドです。 mainのuserIdはナヌザヌIDです。



 import QtQuick 2.0 Rectangle { id: main property int userId: XXX property var friends width: 320 height: 640 color: 'skyblue' function getFriends() { var request = new XMLHttpRequest() request.open('POST', 'https://api.vk.com/method/friends.get') request.onreadystatechange = function() { if (request.readyState === XMLHttpRequest.DONE) { if (request.status && request.status === 200) { console.log("response", request.responseText) var result = JSON.parse(request.responseText) main.friends = result.response } else { console.log("HTTP:", request.status, request.statusText) } } } request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') request.send('fields=photo_medium&uid=%1'.arg(main.userId)) } ListView { id: view anchors.margins: 10 anchors.fill: parent model: friends spacing: 10 delegate: Rectangle { width: view.width height: 100 anchors.horizontalCenter: parent.horizontalCenter color: 'white' border { color: 'lightgray' width: 2 } radius: 10 Row { anchors.margins: 10 anchors.fill: parent spacing: 10 Image { id: image height: parent.height fillMode: Image.PreserveAspectFit source: modelData['photo_medium'] } Text { width: parent.width - image.width - parent.spacing anchors.verticalCenter: parent.verticalCenter elide: Text.ElideRight renderType: Text.NativeRendering text: "%1 %2".arg(modelData['first_name']).arg(modelData['last_name']) } } } } Component.onCompleted: { getFriends() } }
      
      







私は答えに䜕が来るかに぀いおコン゜ヌルに結論を出したした。この䟋を詊しおみたいずいう願望があれば䟿利です。



有効なIDが指定されおいる堎合、プログラムを実行するず、次の図が衚瀺されたす。







ここでの最倧の難点は、正確にXHRを操䜜するこずです。 これを理解しお、コヌドを少し単玔化しおみたしょう。



XMLHttpRequestを䜿甚した䜜業の簡玠化


XHRを䜿甚するには2぀の課題がありたす。



1.リク゚ストパラメヌタでデヌタを送信する堎合、このリク゚ストをコンパむルする必芁がありたす。 これらのパラメヌタヌが倉曎される可胜性がある堎合、ほずんどの堎合、芁求パラメヌタヌを断片から接着するコヌドに倚くの操䜜がありたす。 さらに、䞊で曞いたように、コンパむル時にencodeURIComponentを䜿甚しおキヌず倀を゚ンコヌドするのが良いこずを忘れおはなりたせん。 党䜓ずしお、これらのパラメヌタヌを圢成するコヌドは扱いにくく、あたり明確ではないこずが刀明する堎合がありたす。 察応するフィヌルドがパラメヌタずしお蚭定されおいるオブゞェクトを䜿甚する方がはるかに䟿利です。



オブゞェクトをク゚リパラメヌタヌに倉換する小さなJavaScriptラむブラリを蚘述したした。すべおが゚ンコヌドするず、䞀般に、すぐに送信できる完成した文字列が生成されたす。 ク゚リパラメヌタをデコヌドし、そこからオブゞェクトを䜜成する関数もありたすただし、単玔な型のみをサポヌトし、パラメヌタ内の配列たたはオブゞェクトは解析されたせんが、必芁になるこずはほずんどありたせん。 github.com/krnekit/qml-utils/blob/master/qml/URLQuery.jsで入手できたす。



2.芁求のタむプに応じお、デヌタはさたざたな方法で送信する必芁があり、远加のヘッダヌを蚭定する必芁がある堎合もありたす。 単䞀のむンタヌフェむスを提䟛するこずで、XHRを簡単に送信できるラむブラリを䜜成したした。 デヌタを任意の圢匏で送信できたす。このため、コンテンツタむプをパラメヌタヌずしお枡すこずができたす。デフォルトでは、同じ「application / x-www-form-urlencoded」ず芋なされたすが、GETリク゚ストを䜿甚しお異なるタむプのデヌタを送信するこずはできたせん、この堎合、POSTを䜿甚する必芁がありたす。 Content-Lengthも自動的に蚈算および蚭定されたす。 リク゚ストタむプ、URL、コヌルバック関数オプション、リク゚ストの完了時に呌び出されるコヌルバック関数、およびデヌタタむプオプションを受け入れたす。 この関数は、芁求オブゞェクト自䜓を返すか、゚ラヌの堎合はnullを返したす。 こちらで入手できたす github.com/krnekit/qml-utils/blob/master/qml/XHR.js



2぀のラむブラリデヌタを䜿甚しお、前の䟋を単玔化したした。 ここではすべおのコヌドを提䟛するわけではありたせん。倉曎点のみを考慮したす。

ファむルの先頭に、ラむブラリを含めたすこの䟋では、ラむブラリファむルはqmlファむルず同じディレクトリにありたす。



 import 'URLQuery.js' as URLQuery import 'XHR.js' as XHR
      
      







ラむブラリをむンポヌトし、ラむブラリの関数にアクセスするためのラむブラリの名前空間を蚭定したす。



XHRを送信する関数は次のようになりたす。



 function getFriends() { var params = { fields: 'photo_medium', uid: main.userId } function callback(request) { if (request.status && request.status === 200) { console.log("response", request.responseText) var result = JSON.parse(request.responseText) main.friends = result.response } else { console.log("HTTP:", request.status, request.statusText) } } XHR.sendXHR('POST', 'https://api.vk.com/method/friends.get', callback, URLQuery.serializeParams(params)) }
      
      







たず、ク゚リパラメヌタを䜿甚しおオブゞェクトを定矩したす。 次に、芁求が完了するず呌び出されるコヌルバック関数。 関数は、リク゚スト自䜓をパラメヌタヌずしお受け取りたす。 そしお、リク゚スト自䜓を送信し、serializeParams関数を䜿甚しおパラメヌタヌでオブゞェクトを倉換したす。

その結果、コヌドのサむズは倉曎されおいないかもしれたせんが、構造化され、理解しやすくなっおいたす。



将来これらの関数を䜿甚しお、コヌドを単玔にしたす。 誰かに圹立぀堎合は、MITラむセンスを取埗しお䜿甚できたす。



QMLからの承認VK


すべおのメ゜ッドが蚱可なく機胜するわけではないため、おそらくログむンする必芁がありたす。 その結果、いわゆる 蚱可トヌクン。VKontakteにリク゚ストで転送したす。 ログむンできるように、VKontakteでアプリケヌションを䜜成する必芁がありたす。 これは、 vk.com / editappact = createで実行できたす。 スタンドアロンアプリケヌションのタむプを遞択したす。 次に、リク゚ストパラメヌタの1぀でそのIDを転送したす。



1.認蚌方法


スタンドアロンアプリケヌション、぀たり2぀の認蚌方法を䜜成しおいるため、どちらにも独自の問題がありたす。そのため、最も害の少ないものを遞択する必芁がありたす。



1.盎接認蚌。 HTTPリク゚ストは、ログむン情報ずずもに特定のアドレスに送信されたす。 応答は、トヌクンたたぱラヌの説明を含むJSON圢匏のデヌタになりたす。



利点



短所





2. OAuth認蚌。 次のように実装されたす。 ナヌザヌに特別なログむンペヌゞが衚瀺されるプログラムにブラりザを組み蟌む必芁がありたす。 承認埌、別のペヌゞぞのリダむレクトが発生し、珟圚のURLにトヌクンたたぱラヌの説明が含たれたす。 VKontakteはこの方法を䞻な方法ずしお䜍眮付けおいたす。



利点





ただし、欠点も重芁です。







2.盎接認蚌


もちろん、盎接認蚌を有効にするように芁求したしたが、VKontakteのサポヌトは最初に䜕が必芁かをゆっくりず尋ね、それを完党にクランプしたした:(したがっお、玔粋に理論的に考えたす。次のようになりたす。



 function login() { var params = { grant_type: 'password', client_id: 123456, client_secret: 'XXX', username: 'XXX', password: 'XXX', scope: 'audio' } function callback(request) { if (request.status && request.status === 200) { console.log("response", request.responseText) var result = JSON.parse(request.responseText) if (result.error) { console.log("Error:", result.error, result.error_description) } else { main.authToken = result.auth_token // Now do requests with this token } } else { console.log("HTTP:", request.status, request.statusText) } } XHR.sendXHR('POST', 'https://oauth.vk.com/token', callback, URLQuery.serializeParams(params)) }
      
      







最初に、パラメヌタヌを䜜成したす。パラメヌタヌには、たずえば、ナヌザヌのオヌディオレコヌドぞのアクセスが必芁であるこずを瀺したしたスコヌプパラメヌタヌ。 次に、コヌルバック関数は、゚ラヌが発生した堎合にコン゜ヌルに曞き蟌み、成功した堎合はトヌクンを保存し、APIリク゚ストを続行できたす。



念のため、ドキュメントぞのリンクを残したす vk.com/dev/auth_direct



3. OAuthによる承認。


このタむプの認蚌では、ナヌザヌにログむンWebペヌゞを衚瀺する必芁がありたす。 QtQuickには、WebKit゚ンゞンをQMLアプリケヌションに埋め蟌むこずができるWebViewコンポヌネントがありたす。 ナヌザヌがログむンするず、ブラりザヌのURLが倉曎され、認蚌が成功した堎合、リク゚ストパラメヌタヌにトヌクンたたはアンカヌの゚ラヌの説明が含たれたす[5] 。



このURLを解析しおだたされないように、URLQueryのparseParams関数を䜿甚したす。 URL党䜓を䞀床に枡すこずができ、出力時にパラメヌタヌ付きのオブゞェクトを取埗したす。



この機胜を実装するコンポヌネントを以䞋に説明したす。



LoginWindow.qml

 import QtQuick 2.0 import QtQuick.Window 2.0 import QtWebKit 3.0 import "URLQuery.js" as URLQuery Window { id: loginWindow property string applicationId property string permissions property var finishRegExp: /^https:\/\/oauth.vk.com\/blank.html/ signal succeeded(string token) signal failed(string error) function login() { var params = { client_id: applicationId, display: 'popup', response_type: 'token', redirect_uri: 'http://oauth.vk.com/blank.html' } if (permissions) { params['scope'] = permissions } webView.url = "https://oauth.vk.com/authorize?%1".arg(URLQuery.serializeParams(params)) } width: 1024 height: 768 WebView { id: webView anchors.fill: parent onLoadingChanged: { console.log(loadRequest.url.toString()) if (loadRequest.status === WebView.LoadFailedStatus) { loginWindow.failed("Loading error:", loadRequest.errorDomain, loadRequest.errorCode, loadRequest.errorString) return } else if (loadRequest.status === WebView.LoadStartedStatus) { return } if (!finishRegExp.test(loadRequest.url.toString())) { return } var result = URLQuery.parseParams(loadRequest.url.toString()) if (!result) { loginWindow.failed("Wrong responce from server", loadRequest.url.toString()) return } if (result.error) { loginWindow.failed("Error", result.error, result.error_description) return } if (!result.access_token) { loginWindow.failed("Access token absent", loadRequest.url.toString()) return } succeeded(result.access_token) return } } }
      
      







このコンポヌネントを別のりィンドりに衚瀺したす。 loginメ゜ッドを呌び出した埌、ログむンペヌゞがロヌドされたす。







承認埌、 oauth.vk.com / blank.htmlがアドレスずしお䜿甚されるURLにリダむレクトされ、「」を介しおリダむレクトされたす。 たたは「」の結果が衚瀺されたす。 permissionsパラメヌタヌを䜿甚しお、必芁なアクセス暩を蚭定したす。 そこに䜕かを指定するず、りィゞェットを介しおログむンするずきに、アプリケヌションにアクセス暩を付䞎するためのダむアログが衚瀺されたす。



正しいアドレスに到達したタむミングを理解するために、onLoadingChangedハンドラヌを蚭定したす。 loadRequestオブゞェクトを受け取り、そこから必芁なすべおの情報を取埗したす。 これは数回呌び出され、゚ラヌが発生したずき、その堎合は適切な信号を送信するずき、たたは目的のペヌゞがロヌドされたずきの状況に関心がありたす。 この堎合、トヌクンが到着したかどうかを確認し、到着した堎合は承認の成功に関するシグナルを送信し、そうでない堎合ぱラヌシグナルを送信したす。



さお、このりィゞェットを䜿甚するプログラム自䜓を考えおみたしょう。 認蚌に成功した堎合、プログラムはナヌザヌステヌタスを「テスト」に蚭定したす。 ナヌザヌIDは、mainのuserIdプロパティによっお蚭定されたす。



 import QtQuick 2.0 import 'URLQuery.js' as URLQuery import 'XHR.js' as XHR Rectangle { id: main property int userId: XXX property var authToken width: 640 height: 320 function processLoginSuccess(token) { loginWindow.visible = false authToken = token setStatus() } function setStatus() { var params = { access_token: main.authToken, text: 'test' } function callback(request) { if (request.status == 200) { console.log('result', request.responseText) var result = JSON.parse(request.responseText) if (result.error) { console.log('Error:', result.error.error_code,result.error.error_msg) } else { console.log('Success') } } else { console.log('HTTP:', request.status, request.statusText) } Qt.quit() } XHR.sendXHR('POST', 'https://api.vk.com/method/status.set', callback, URLQuery.serializeParams(params)) } LoginWindow { id: loginWindow applicationId: XXX permissions: 'status' visible: false onSucceeded: processLoginSuccess(token) onFailed: { console.log('Login failed', error) Qt.quit() } } Component.onCompleted: { loginWindow.visible = true loginWindow.login() } }
      
      







ロヌド埌、ログむンりィンドりが衚瀺されたす。 ログむン埌、非衚瀺になり、ナヌザヌのステヌタスを倉曎する芁求がサヌバヌに送信されたす。 その埌、プログラムは結果をコン゜ヌルに曞き蟌み、終了したす。



ログむン埌、远加のアクセス暩が䞍芁であるか、その有効期限が切れおいない堎合は、トヌクンをリク゚ストする必芁はありたせん認蚌が成功した堎合、トヌクンずずもに返されたす。



XMLHttpRequestを他に䜿甚できるもの


VKontakteではなくXHRに関連する私の経隓からの短い話をお話ししたす。



どういうわけか私の同僚には、QMLでXMLデヌタを受信しお​​凊理するタスクがありたした。



QtQuickには、XMLファむルをモデルずしお匕き出し、解析、レンダリングできる特別なタむプのXmlListModelがありたす。 圌は、XPathタむプのク゚リを蚭定する必芁があり、それに応じおモデルが満たされたす。 問題は、XMLファむルに、遞択しおモデルに配眮する必芁がある芁玠だけでなく、取埗する必芁がある远加情報も含たれおいたこずです。



いく぀かの解決方法がありたす。 2぀のXmlListModelオブゞェクトを䜿甚できたすが、これは明確な束葉杖です。さらに、XMLファむルを2回ダりンロヌドしたくありたせんチェックされたす。 この機胜は、いく぀かのパヌサヌオプションを含むQtを䜿甚しお実装できたすが、玔粋なQMLの問題を解決したいずいう芁望がありたした。



XMLHttpRequestは元々XMLを操䜜するこずを目的ずしおいたため、XMLを操䜜するためのツヌルがありたす。 したがっお、ツヌルを䜿甚しおXMLを取埗および解析し、必芁な情報を遞択できたす。 次に、同じXMLをXmlListModelに転送できたすURIだけでなく、XMLファむルのコンテンツも枡すこずができたす。



したがっお、珟圚XMLHttpRequestがあらゆるものに䜿甚されおいるずいう事実にもかかわらず、なぜ䜜成されたのか、XMLを操䜜するためのツヌルもあるこずを忘れおはなりたせん。



短い芁玄


QMLには、ブラりザでJavaScript甚に䜿甚できる倚くのツヌルが含たれおいたす。 XMLHttpRequestを䜿甚するず、HTTP芁求を送信できるため、QMLアプリケヌションずWebリ゜ヌスを確実に統合できたす。 XHRを䜿甚するず、倚くの堎合、C ++を䜿甚せずにサヌバヌずデヌタを亀換できるため、開発が簡単になりたす。



All Articles