2011-08-04 6 views
1

Je tente de créer une application VB.net qui récupérera divers utilisateurs de Facebook via leur méthode de requêtes par lots API Graph. Mon problème semble être dans l'exécution de la demande réelle. Lorsque j'essaie de récupérer la réponse, je reçois une erreur 400 du serveur disant "Bad Request". Je ne suis pas sûr si cela signifie que je forme mal le corps de la demande, ou si je le corrige dans le code.Requêtes par lots Facebook

Voici mon code de demande:

Dim sURL As String 
    sURL = "https://graph.facebook.com" 

    Dim wrGETURL As WebRequest 
    wrGETURL = WebRequest.Create(sURL) 
    wrGETURL.Method = "POST" 
    wrGETURL.Proxy = WebRequest.DefaultWebProxy 
    Dim reqStream As IO.Stream = wrGETURL.GetRequestStream() 

    Dim access_token As String = "..." ' Access token removed, but it is valid 

    Dim jsonReq As String = """access_token"": """ + access_token + """" 
    jsonReq = jsonReq + """batch"": [" 

    AddBatchRequest(jsonReq, "[email protected]") 
    AddBatchRequest(jsonReq, "[email protected]") 

    jsonReq = jsonReq + "]" 

    Dim enc As New System.Text.UTF8Encoding() 
    Dim jsonBytes As Byte() = enc.GetBytes(jsonReq) 

    reqStream.Write(jsonBytes, 0, jsonBytes.Length) 

    reqStream.Close() 

    Dim oLabel As Label = output_label 

    Dim objStream As Stream 
    Try 
     objStream = wrGETURL.GetResponse.GetResponseStream() '<<<<Crashes here 

     Dim objReader As New StreamReader(objStream) 
     Dim sLine As String = "" 
     Dim i As Integer = 0 

     Dim ostr As String = "" 

     Do While Not sLine Is Nothing 
      i += 1 
      sLine = objReader.ReadLine 
      If Not sLine Is Nothing Then 
       ostr = ostr + sLine 

      End If 
     Loop 

     oLabel.Text = ostr 
    Catch ex As Exception 
     oLabel.Text = ex.Message 
    End Try 

Private Sub AddBatchRequest(ByRef json As String, ByVal email As String) 
    If json.EndsWith("}") Then 
     json = json + "," 
    End If 
    json = json + "{""method: ""GET"", ""relative_url"": ""search?q=" + email + "&type=user""}" 
End Sub 

J'ai essayé une tonne de variations sur la façon de former le corps de chaîne, mais aucun d'entre eux travaillent, me conduit à croire que je ne suis pas ajoutais la corps correctement.

+0

Deux nitpicks: d'abord, utilisez toujours un bloc 'Using 'autour de vos flux au lieu de les fermer manuellement. Deuxièmement, 'Not x Is y' peut (et devrait!) Être raccourci en' x IsNot y'. –

+0

Je suis vraiment nouveau sur VB.net, la plupart de mon expérience est en c/C++, donc je ne connais pas beaucoup la syntaxe spéciale de VB. Que fait le bloc 'Using 'par rapport à la fermeture manuelle du flux? –

+0

La fermeture manuelle n'aura pas lieu si une exception est levée (ou si vous laissez la fonction autrement) alors que le flux est ouvert. 'Using 'fermera le flux, peu importe quoi. –

Répondre

0

La meilleure chose à faire serait d'utiliser la Facebook SDK qui prend en charge batch requests. Vous feriez quelque chose comme:

Dim fb = New FacebookClient(accessToken) 
Dim results = fb.Batch(New FacebookBatchParameter("[email protected]&type=user"), New FacebookBatchParameter("[email protected]&type=user")) 

Je pense que votre problème est que le jsonReq n'est pas un corps POST correctement formaté. Collez cette valeur ici et je suis sûr que quelqu'un peut souligner spécifiquement ce qui ne va pas. Je n'ai pas VB.NET installé.

+0

J'espérais que quelqu'un pourrait me dire comment il doit être formaté, puisque leurs exemples pour faire des demandes par lots semblent être dans quelque chose comme python. Je suis vraiment déçu de la documentation de Facebook, leurs explications et leur code d'exemple sont si spécifiques qu'il est difficile d'utiliser leur code dans quelque chose d'autre. –