2013-08-13 6 views
0

Dans le code donné, j'ai utilisé une étiquette et un bouton. Je veux que quand je clique sur le bouton une demande doit être envoyée qui obtient le Json du lien donné et imprime sur l'étiquette. mais pour ce code, je suis juste en train d'imprimer "OK" à l'intérieur de l'étiquette en cas de succèsXMLHttpRequest ne fonctionne pas dans QML Blackberry 10

Le problème est que je ne suis pas en train de dire if. en fait sur le bouton cliqué rien ne se passe. Je sais qu'il est gestionnaire de réseau dans l'intervalle QT que je peux utiliser, mais dans ma situation que je veux analyser l'intérieur QML

// Default empty project template 
import bb.cascades 1.0 

// creates one page with a label 

Page { 
    Container { 
     layout: StackLayout {} 
     Label { 
      id: msgLabel 
      text: qsTr("Hello World") 
      textStyle.base: SystemDefaults.TextStyles.BigText 
      verticalAlignment: VerticalAlignment.Center 
      horizontalAlignment: HorizontalAlignment.Center 
     } 
     Button { 
      id: requestXML 
      objectName: "requestXML" 
      onClicked: { 
       var doc = new XMLHttpRequest(); 
       doc.onreadystatechange = function() { 
        if (doc.readyState == 4) { 
         msgLabel.text="OK" 
         // pass “doc.responseText” to C++ for Parsing 
        } 
       } 
       doc.open("GET", "http://www.example.com/sample.json", true); 
       doc.send(); 

      } 
    } 
    } 
} 

Dans mon fichier .pro je l'ai déclaré

CONFIG += qt warn_on cascades10 
QT += network 
CONFIG += debug 
CONFIG += console 
LIBS += -lbbdata 
QT +=script 
QT +=scripttools 

Où je me trompe? ou je dois déclarer quelque chose d'autre

+0

atout: ///main.qml: 29: SyntaxErro r: Erreur d'analyse; c'est doc.open (...) –

+0

Vous utilisez l'ancienne API twitter! '{" errors ": [{" message ":" L'API Twitter REST v1 n'est plus active. Veuillez la migrer vers l'API v1.1 https://dev.twitter.com/docs/api/1.1/overview. " , "code": 68}]} ' –

+0

@BojanKogoj ici le problème n'est pas avec l'API Twitter. le problème principal est que je ne reçois aucune réponse de n'importe quel lien JSON –

Répondre

0

I don't have access to Twitter API, donc je ne peux pas le tester correctement pour vous. Mais cela fonctionne pour d'autres fichiers JSON. Pour cet exemple, vous n'avez besoin que de LIBS + = -lbbdata dans votre fichier .pro. En outre, lisez DataSource et JsonDataAccess. Si j'étais vous je téléchargerais JSON par C++.

import bb.cascades 1.0 
import bb.data 1.0 

Page { 
    Container { 
     layout: StackLayout { 
     } 
     Label { 
      id: msgLabel 
      text: qsTr("Hello World") 
      textStyle.base: SystemDefaults.TextStyles.BigText 
      verticalAlignment: VerticalAlignment.Center 
      horizontalAlignment: HorizontalAlignment.Center 
     } 
     Button { 
      id: requestXML 
      onClicked: { 
       dataSource.load(); 
      } 
     } 
     attachedObjects: [ 
      DataSource { 
       id: dataSource 
       source: "https://api.twitter.com/1.1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=ladygaga" 
       type: DataSourceType.Json 

       onDataLoaded: { 
        console.log("loaded"); 
        console.log(JSON.stringify(data)); //just for testing 
        console.log(data);   
       } 
       onError: { 
        console.log(errorType); 
        console.log(errorMessage); 
       } 
      } 
     ] 
    } 

également l'API de Twitter que vous utilisez n'est plus disponible vérifier si REST API v1.1 Resources ou vous obtiendrez l'erreur suivante:

{"errors": [{"message": "The Twitter REST API v1 is no longer active. Please migrate to API v1.1. https://dev.twitter.com/docs/api/1.1/overview.", "code": 68}]} 
+0

Génial cela fonctionne. mais puis-je demander quel est le problème avec mon code. –

+0

Je ne sais pas, peut-être que ce n'est pas supporté. –

0

Je pense que le problème est dans la demande inter-domaines qui ISN n'est pas autorisé par défaut. Dans WebWorks, vous devez déclarer un <access> élément dans votre demande config.xml fichier pour le domaine (s) que vous souhaitez accéder.

Malheureusement, je ne sais pas comment faire la même chose dans un projet natif QML. Les éléments existants dans bar-descriptor.xml ne permettent pas de faire la même chose.

AJOUTÉE:

J'ai écrit un bout HTTP simple pour les tests qui devine et ressemble à c'est en effet ce qui cause des problèmes:

$ echo -e 'HTTP/1.1 200 OK\n\n' | nc -l 8080 


GET /user_timeline.json?include_entities=true&include_rts=true&screen_name=ladygaga HTTP/1.1 
CONTENT-TYPE: application/x-www-form-urlencoded 
Connection: Keep-Alive 
Accept-Encoding: gzip 
Accept-Language: en-GB,* 
User-Agent: Mozilla/5.0 
Host: 192.168.1.106:8080 

Je reçois XMLHttpRequest.status == 200 dans ce cas alors que sur l'accès à point final Twitter I obtenir XMLHttpRequest.status == 0 pour le même code:

import bb.cascades 1.0 

Page { 
    Container { 
     layout: StackLayout { 
     } 
     Label { 
      id: msgLabel 
      text: qsTr("Hello World") 
      textStyle.base: SystemDefaults.TextStyles.BigText 
      verticalAlignment: VerticalAlignment.Center 
      horizontalAlignment: HorizontalAlignment.Center 
     } 
     Button { 
      id: requestXML 
      objectName: "requestXML" 
      onClicked: { 
       sendRequest(); 
      } 
     } 
    } 

    function sendRequest() { 
     var ajax = new XMLHttpRequest(); 
     ajax.onreadystatechange = function() { 
      if (ajax.readyState === XMLHttpRequest.DONE) { 
       console.log("ajax.status: " + ajax.status); 
       if (ajax.status === 200) { 
        console.log("Response = " + ajax.responseText); 
       } else { 
        // This is very handy for finding out why your web service won't talk to you 
        console.log("Status: " + ajax.status + ", Status Text: " + ajax.statusText); 
       } 
      } 
     } 
//  var url = "http://192.168.1.106:8080/user_timeline.json?include_entities=true&include_rts=true&screen_name=ladygaga"; 
     var url = "https://api.twitter.com/1.1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=ladygaga"; 
     ajax.open("GET", url, true); // only async supported 
     ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') 
     ajax.send(); 
    } 
} 
Questions connexes