我正在尝试使用tcl发送http post请求。我的代码如下:
proc ::rest::setRequest {req} {
upvar $req str
set str "POST domain.com HTTP/1.1\r\n"
append str "Host: blablabla\r\n"
append str "Content-Length:11\r\n"
append str "Content-Type:text/xml\r\n"
append str "Authorization: Basic ZGVmYXVsdDpkZWZhdWx0\r\n\r\n"
}
proc ::rest::sendRestMsg {ip port request} {
set chan [socket $ip $port]
puts $chan $request
flush $chan
puts "[gets $chan]"
puts "[gets $chan]"
puts "[gets $chan]"
puts "[gets $chan]"
puts "[gets $chan]"
puts "[gets $chan]"
puts "[gets $chan]"
puts "[gets $chan]"
puts "[gets $chan]"
puts "[gets $chan]"
puts "[gets $chan]"
puts "[gets $chan]"
puts "[gets $chan]"
puts "[gets $chan]"
puts "[gets $chan]"
puts "[gets $chan]"
puts "[gets $chan]"
}
我的问题是服务器解析器不断告诉我HTTP / 1.1 400 Bad Request,HTTP header lexer error at character' ' (0xd)在buf_p = 0x5b8c7074 offset = 32之前。
来自" \ n"在第一行。我的标题出了什么问题?感谢
答案 0 :(得分:1)
Tcl转换通道上的输入和输出,以便您可以在脚本中使用\n
(可能隐式地,通过puts
),并且当字节到达时使用的平台具有正确的换行符样式OS。它主要是默认情况下正确的,但并非总是如此。
如果您想要\r\n
作为分隔符的套接字,则应明确配置它。
set chan [socket $ip $port]
fconfigure $chan -translation crlf
# You might also need to configure the character -encoding
在那之后,你可以假装一切都很简单,它应该“只是工作”。
如果你想要精确控制发送的字节,请将转换更改为binary
并使用puts -nonewline
写出确切的字节序列:
fconfigure $chan -translation binary
puts -nonewline $chan "these_are really raw_bytes\r\n"
binary format
命令可以帮助创建消息,encoding convertto
命令也是如此。两者都产生字节数组(一个特殊的字符串,其中的字符很方便地对应于字节)。
答案 1 :(得分:0)
我发现错误的套接字缓冲区不接受/ r / n。因此,要使其正常工作,请逐行写入请求