Finally, that JSON parser seems like an awful lot of code to use if you'll only ever be looking for the text between '"translatedText":"' and '"', to me.
Yep, but I think I'll be using it for config and whatnot aswell..
Nothing I changed made a connection (using "http::" and writeline("GET /" + url + "HTTP/1.0 (or 1.1) ~r~n~r~n")), OpenStream still returns null. I think I'll be using my modified THttp type (
codearcs), as it seemed to work before for getting pages.
I swear I had it getting pages just a few hours ago.. now its not working. I checked against your HTTP header code, all seems to be in place...
(See the Get method)
SuperStrict
Framework brl.standardio
Import brl.stream
Import brl.Socket
Import brl.socketstream
Import brl.retro
Import brl.filesystem
Import brl.LinkedList
Import brl.Map
Include "json.bmx"
Local word:String = "Hello there!"
Local Text:String = GetHTTPString("www.ajax.googleapis.com", "ajax/services/language/Translate?v=1.0&q=" + word + "&langpair=en%7Cel")
Print Text
'Local json:TJSON = TJSON.Create(Text)
'Print json.GetValue("translatedText").ToString()
Function GetHTTPString:String(url:String, page:String)
rem
Local stream:TStream = OpenStream("tcp::" + url), data:String
If stream <> Null
stream.WriteString("GET /" + page + " HTTP/1.0~r~n~r~n")
data = LoadString(stream)
SaveText(data, "text.txt")
Else
DebugLog "Failed to open " + url
End If
Return data
endrem
Local httpd:THttp = New(THttp)
If httpd.open(url)
Local htrd:HTTPReturnData = httpd.Get(page)
If htrd <> Null
Return htrd.Content
Else
Return Null
End If
Else
Return Null
End If
End Function
Type THttp
Field sock:TSocket
Field stream:TStream
Field host:String
Field agent:String = "HTTPGET/1.0"
Field autoClose:Int
Method Open:Int(host:String, autoClose:Int = False)
Self.sock = CreateTCPSocket()
If ConnectSocket(Self.sock, HostIp(host), 80)
Self.host = host
Self.stream = CreateSocketStream(Self.sock)
Self.autoClose = autoClose
Return True
Else
Return False
End If
End Method
Method Get:HTTPReturnData(Get:String = "")
Local HTRD:HTTPReturnData = New(HTTPReturnData), buffer:String, rlnewline:String
stream.WriteString("GET /" + Get + " HTTP/1.0~nHOST: " + host + "~r~n~r~n")
'WriteLine(stream, "GET /" + get + " HTTP/1.0~nHost: " + Self.host + "~nUser-Agent: " + Self.agent + "~n~n")
'WriteLine stream, "GET /" + Get + " HTTP/1.0" ' GET / gets Default page
'WriteLine stream, "Host: " + host
'WriteLine stream, "User-Agent: " + agent
'WriteLine stream, "Accept: */*"
'WriteLine stream, ""
Local cExtType:String, cExt:String, cLength:Int
ReadLine(stream)
While Not Eof(stream)
rlnewline = ReadLine(stream)
Local spos:Int = Instr(rlnewline, ":")
Select Lower(Left(rlnewline, spos - 1))
Case "content-type"
Local prtmp:String = Mid(rlnewline, spos + 2, Instr(rlnewline, ";") - spos - 2), slpos:Int = Instr(prtmp, "/")
cExtType = Left(prtmp, slpos - 1) cExt = Right(prtmp, prtmp.Length - slpos)
Case "content-length"
cLength = Int(Right(rlnewline, rlnewline.Length - spos - 1))
Case ""
Exit
End Select
Wend
While Not Eof(stream)
rlnewline = ReadLine(stream)
buffer:+ rlnewline + "~n"
Wend
HTRD.Set(Left(buffer, buffer.Length - 1), cExtType, cExt, cLength)
If autoClose Close()
Return HTRD
End Method
Method Post:String(page:String = "", keys:String[] , values:String[] )
Local buffer:String
Local data:String
Local i:Int
For i = 0 To keys.Length - 1
data:+ UrlEncode(keys[i] ) + "=" + UrlEncode(values[i] ) + "&"
Next
data = Left(data, data.Length - 1)
WriteLine(stream, "POST /" + page + " HTTP/1.0~nHost: " + Self.host + "~nUser-Agent: " + Self.agent + "~nContent-Length: " + data.Length + "~nContent-Type: application/x-www-form-urlencoded~n~n" + data)
While Not Eof(stream)
buffer:+ReadLine(stream) + "~n"
Wend
If autoClose Close()
Return Left(buffer, buffer.Length - 1)
End Method
Method Close()
If Self.stream CloseStream(Self.stream)
If Self.sock CloseSocket(Self.sock)
End Method
Function UrlEncode:String(url:String)
Local buffer:String
Local Char:Int
Local i:Int
For i = 1 To url.Length
Char = Asc(Mid(url, i, 1))
If(Char >= 48 And Char <= 57) Or (Char >= 65 And Char <= 90) Or (Char >= 97 And Char <= 122) Or Char = 43 Or Char = 45 Or Char = 46 Or Char = 95
buffer = buffer + Chr(Char)
Else
buffer = buffer + "%" + Right(Hex(Char), 2)
End If
Next
Return buffer
End Function
Function UrlDecode:String(url:String)
Local sHex:String = "0123456789ABCDEF"
Local buffer:String
Local i:Int
For i = 1 To url.Length
If Mid(url, i, 1) = "%"
buffer = buffer + Chr(Instr(sHex, Mid(url, i + 1, 1)) Shl 4 + Instr(sHex, Mid(url, i + 2, 1)) - 17)
i:+ 2
Else
buffer = buffer + Mid(url, i, 1)
End If
Next
Return buffer
End Function
End Type
Type HTTPReturnData
Field Content:String
Field ContLength:Int
Field ExtensionType:String
Field Extension:String
Method Set(Cont:String, ExtType:String, Ext:String, CLen:Int)
Content = Cont
ContLength = CLen
Extension = Ext
ExtensionType = ExtType
End Method
Method SaveContent(File:String, useExt:Int = False)
If useExt File:+ "." + Extension
SaveText(Content, File)
End Method
Method ToString:String()
Return "Content-Type: " + ExtensionType + "/" + Extension + "~nContent-Length: " + ContLength
End Method
End Type