【发布时间】:2012-05-15 11:13:01
【问题描述】:
我发现自己需要一种方法来测试我的应用程序发出的 post 请求。
我将我的请求发送到http://macbook-pro.local/,我正在尝试找出我可以运行什么服务来读取和显示请求。
我查看了RestKit 没有任何运气。
【问题讨论】:
标签: post macos macos http http-post netcat
我发现自己需要一种方法来测试我的应用程序发出的 post 请求。
我将我的请求发送到http://macbook-pro.local/,我正在尝试找出我可以运行什么服务来读取和显示请求。
我查看了RestKit 没有任何运气。
【问题讨论】:
标签: post macos macos http http-post netcat
您想要的基本上是一个非常简单的 Web 服务器,但如果您只想打印 HTTP POST 请求中的内容,您可以使用内置的“nc”命令。您可以使用终端打印出本地端口 10000 上传入请求的内容,方法是在这样的循环中运行“nc”:
while true; do nc -l 10000 < /dev/null ; printf '\n\n\n'; done
然后,您可以在浏览器中转到 http://localhost:10000,并在终端窗口中看到 HTTP 请求。网络浏览器会给出一条错误消息,因为“nc”不够聪明,无法回复。
要测试 HTTP POST 请求,您可以使用“curl”:
curl --data "this-is-POST-data" http://localhost:10000
再一次,curl 会给出一条错误消息,因为 'nc' 只是关闭连接而没有给出正确的 HTTP 回复。您可以使用静态 HTTP 响应对所有请求进行“nc”回复,如下所示:
while true; do printf 'HTTP/1.0 200 OK\r\nContent-type: text-plain\r\n\r\nHello, world!' | nc -l 10000 ; printf '\n\n\n'; done
如果您需要使用端口 80,则需要以 root 身份运行“nc”(例如,使用“sudo”)。
但是,如果您需要进行任何类型的真实 HTTP 流量,则需要获得合适的 Web 服务器。 OS X 带有 Apache Web 服务器,可以使用命令“apachectl start”(“apachectl stop”来停止它)启动它。 CGI 已启用,因此您可以将可执行文件放入 /Library/WebServer/CGI-Executables 并使用http://localhost/cgi-bin/filename 访问它们。例如,如果您创建以下 CGI 脚本:
#!/bin/sh
printf 'Content-type: text/plain\r\n\r\n'
cat > /tmp/post-data
echo OK
调用它,比如“test.sh”并将其放在 CGI-Executables 文件夹中,然后运行:
chmod +x /Library/WebServer/CGI-Executables/test.sh
然后,每当您向http://localhost/cgi-bin/test.sh 发送 POST 请求时,它都会将 POST 数据的内容保存到您计算机上的文件 /tmp/post-data 中。
注意:在所有示例中,如果这是您的计算机主机名,则“localhost”可以替换为“macbook-pro.local”以通过网络进行访问。
另请注意,您的 OS X 防火墙权限可能会阻止“nc”和其他软件侦听 TCP 端口。通常你应该得到一个权限对话框,但如果你只是得到“权限被拒绝”,请在系统偏好设置 -> 防火墙 -> 防火墙选项中调整你的防火墙设置。
【讨论】:
nc 函数工作得很好,但是 .sh 文件没有保存发送的帖子,但我确实得到了 OK 响应。我错过了什么吗? .sh 文件是否需要一些终端“帮助”?
while true; do nc -l 10000 < /dev/null ; printf 'Content-type: text/plain\r\n\r\n' cat > /MYDIR/post-data echo OK; done 保存文件,但仅使用 Content-type: text/plain 而不是 POST 的内容..
这些是您可以编写以解析 GET 数据的示例行。
SBJsonParser *parser = [[SBJsonParser alloc] init];
NSDictionary *dict = [parser objectWithData:urlData];
[dictionary setDictionary:dict];
[parser release];
这些是您可以写入 POST 数据的示例行。
SBJsonWriter *writer = [[SBJsonWriter alloc] init];
jsonStr = [writer stringWithObject:dictionary];
[writer release];
框架中有更多的方法可以做一些有用的事情。
【讨论】: