手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆

snoopy的缺陷与CURL的强大

首页 > PHP >

在使用PHP进行POST和GET的时候,如果为了简单的应用,大多情况下,我们都采用了fsockopen,于是snoopy就成了我们的最佳选择。可惜,并非所有POST都可以通过snoopy来完成。毕竟,在snoopy中,POST的方式,即类似FORM的entype只支持两种 :application/x-www-form-urlencoded和multipart/form-data,一个是针对FORM中的变量,一个是针对文件上传。一般来说这两种足够了。但昨天发现了一个问题。那就是。。。http://www.baidu.com/search/blogsearch_help.html#n7
baidu和google其他一样,都提供了blogsearch的ping服务,因此,你发表博客后,可以通知一下百度,你的博客更新了。
于是昨天尝试着用snoopy来进行POST发送。结果。。。一直失败,提示无法连接80端口,再看一下百度的说明:

XML/HTML代码
  1. ping-service对非POST方法请求返回HTTP_METHOD_NOT_ALLOWED(405)错误代码,对超大错误包返回 HTTP_REQUEST_ENTITY_TOO_LARGE(413)错误代码,对非“text/xml”请求包返回 HTTP_UNSUPPORTED_MEDIA_TYPE(415)错误代码。  
  2. 其他情况返回HTTP_OK(200)代码,xml-rpc响应http包体为一个xml文档,含有一个int值,0表示推送成功,其他值表示推送失败,目前只有0和1。  

而snoopy在连接的时候是需要先fsockopen,打开80端口的连接后才能发送数据。。。所以,死活连接不上了。最后,用了curl。。。短短几行代码就解决了。。
事实上,即使snoopy能够连接上百度的ping服务,也没有办法提交,因为$snoopy->submit()方法的第二个参数必须是数组。众所周知,FORM提交都是由name对应着value的。snoopy正是这样操作的,他无法直接把一个字符串不对应name就提交。。。

以下是curl代码:

XML/HTML代码
  1. set_time_limit( 0 );  
  2. $url = "http://ping.baidu.com/ping/RPC2";  
  3. $data = '<?xml version="1.0" encoding="UTF-8"?>  
  4. <methodCall>  
  5. <methodName>weblogUpdates.extendedPing</methodName>  
  6. <params>  
  7. <param>  
  8. <value><string>百度的空间</string></value>  
  9. </param>  
  10. <param>  
  11. <value><string>http://hi.baidu.com/baidu/</string></value>  
  12. </param>  
  13. <param>  
  14. <value><string>http://hi.baidu.com/baidu/blog/item/5e8b10d574e971cd50da4b74.html</string></value>  
  15. </param>  
  16. <param>  
  17. <value><string>http://hi.baidu.com/baidu/rss</string></value>  
  18. </param>  
  19. </params>  
  20. </methodCall>';  
  21.   
  22.   
  23.   
  24. $header[]="Content-Type: text/xml; charset=utf-8";  
  25.   
  26. $ch = curl_init();  
  27. curl_setopt($ch, CURLOPT_URL, $url);  
  28. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);  
  29. curl_setopt($ch, CURLOPT_POST, 1);  
  30. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  
  31. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
  32. curl_setopt($ch, CURLOPT_HEADER, 0);  
  33. $res = curl_exec($ch);  
  34. curl_close($ch);   
  35. echo '<pre>';  
  36. print_r( htmlspecialchars($res) );  
  37. echo '</pre>';  



本站采用创作共享版权协议, 要求署名、非商业和保持一致. 本站欢迎任何非商业应用的转载, 但须注明出自"易栈网-膘叔", 保留原始链接, 此外还必须标注原文标题和链接.

Tags: snoopy, curl

« 上一篇 | 下一篇 »

只显示10条记录相关文章

使用CURL函数发送数据时的注意事项 (浏览: 32956, 评论: 0)
Snoopy更新 (浏览: 20249, 评论: 1)
转:2011-10-12 PHP重用curl句柄, CURLOPT_HTTPGET的BUG (浏览: 14731, 评论: 0)
开发中的几件事 (浏览: 14308, 评论: 0)

发表评论

评论内容 (必填):