먼저 구현 원칙을 소개하겠습니다.
블로그 게시물에 댓글을 제출하는 핵심은 http 프로토콜 서버를 통해 게시물 요청을 보내는 것입니다. 댓글을 게시하기 전에 무엇을 해야 합니까? 예, 로그인해야 합니다. 하지만 로그인은 또 다른 문제이므로 여기서는 다루지 않겠습니다. 사용자가 로그인하면 서버는 클라이언트에 쿠키를 설정합니다. http는 무국적입니다. 즉, 클라이언트가 서버에 요청을 보낸 후 서버는 응답을 반환합니다. 하나의 통신이 완료되었습니다. 서버는 누가 방금 요청을 보냈는지 기억하지 못합니다. 따라서 클라이언트는 서버가 설정한 쿠키를 이용해 서버에 요청을 보내고 자신의 신원을 서버에 알려야 하며, 서버는 쿠키를 기반으로 응답을 생성합니다.
준비:
이 테스트를 완료하기 위해 다른 블로그 계정(DeanHuangChopper)을 등록했습니다. 블로그 파크에 로그인한 후 내 블로그(DeanChopper)를 열고 "PHP를 사용한 버퍼링 이해"와 같은 내 블로그 게시물 중 하나를 무작위로 엽니다. OB 기능 "메커니즘" 기사(저는 Firefox 브라우저를 사용하는데, 어떤 매개변수가 서버로 전송되는지 직관적으로 확인할 수 있다는 것이 가장 큰 장점입니다), 개발자 옵션을 열고 댓글을 보내는 과정을 기록할 준비를 합니다. 그냥 댓글을 쓰고 댓글을 남깁니다. 이번에는 개발자 옵션을 통해 요청이 기록됩니다.
요청 헤더에만 주의하면 됩니다.
당연히 Http 클래스의 setHeader() 메소드를 통해 요청 헤더 정보를 설정하고 post() 메소드를 통해 전달합니다. 먼저 요청 헤더 정보를 주의 깊게 분석해 보겠습니다. Host, Content-type, Content-length는 일부 http 메소드를 통해 기본적으로 설정되므로 추가할 필요가 없습니다. 그러나 Content-type 유형은 "application/json; charset=UTF-8"이며 이는 Http에서 기본적으로 설정하는 "application/x-www-form-urlencoded"와 다릅니다. 요청 본문은 배열 형식이 아닌 json 형식이므로 원래 Http 게시 방법을 다시 작성해야 합니다.
public function post($body) { $this->setLine('POST'); // 重新设置content-type $this->setHeader('Content-Type:application/json; charset=UTF-8'); // 跳过setBody方法 // $this->setBody($body); $this->body[]=$body; // 计算content-length $this->setHeader('Content-length: ' . strlen($this->body[0])); $this->request(); return $this->response; }
Http 클래스를 다시 수정하면 이 글의 메인 코드 작성을 완료할 수 있습니다. 이론적으로는 헤더 정보 설정 시 쿠키 값만 설정하면 되지만 성공률을 높이려면 헤더 정보를 모두 보내는 것이 가장 좋습니다.
댓글을 보내기 전에 전송된 매개변수를 살펴보세요.
'body' 다음에는 보내고 싶은 내용만 채워주시면 됩니다.
코드 부분:
마지막으로 이 글의 메인 코드는 다음과 같습니다:
<?php require "http.class.php"; $http=new Http('http://www.cnblogs.com/mvc/PostComment/Add.aspx'); //设置头信息 $http->setHeader('Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3'); $http->setHeader('Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3'); $http->setHeader('Accept-Encoding:gzip, deflate'); $http->setHeader('X-Requested-With:XMLHttpRequest'); $http->setHeader('Referer:http://www.cnblogs.com/DeanChopper/p/4688667.html'); $http->setHeader('Cookie:_ga=GA1.2.1359064105.1438444082; __gads=ID=e0c32fd6db6e2a6d:T=1438443900:S=ALNI_Mb6AAflcBD6gcdHgeE3IqVDJYnnjA; .CNBlogsCookie=C8013C91E54C151DEDA30E2C1E842982338C9054A8BB8639AC2DAB7578445BF1DF5BC49D39D8BE5FDAC33541CE4E4FA386CFD3F946EA1D79D1E34809A4CCBD7488A15641AEF685A6258CF3F03597BCAF50049F8C95A310076677598990FB2E4FB1E9671A; _5t_trace_sid=84a9ed0b086c2c127551cf911bec7b1d; _5t_trace_tms=1; _gat=1'); $http->setHeader('Pragma:no-cache'); $http->setHeader('Cache-Control:no-cache'); //设置请求体信息 $msg='{"blogApp":"DeanChopper","postId":4688667,"body":"测试内容","parentCommentId":0}'; //发送post请求 $http->post($msg); echo 'OK';
전송 과정이 다소 느릴 수 있으니 양해해 주시기 바랍니다.
위 소개는 이 글의 전체 내용입니다. 모두 마음에 드셨으면 좋겠습니다.