/** * @see TwitterOAuth::http() * @author Naomichi Yamakita <*****@*****.**> */ public function http($uri, $method, $postData = NULL) { // TwitterOAuth::http() はレスポンスヘッダを書き換えてるため使用しない // (Mars_ResponseParser の動作に影響するため) $sender = new Mars_HttpRequestSender($uri); $sender->setUserAgent($this->useragent); $sender->setReadTimeout($this->connecttimeout); $sender->addHeader('Expect', ''); if (is_string($postData)) { parse_str($postData, $postData); } if ($method === 'POST') { $sender->setRequestMethod(Mars_HttpRequest::HTTP_POST); $sender->addParameters($postData); } else { if ($method === 'DELETE') { $sender->setRequestMethod(Mars_HttpRequest::HTTP_DELETE); if (sizeof($postData)) { $uri = $uri . '?' . OAuthUtil::build_http_query($postData); } } } $sender->setBaseURI($uri); $parser = $sender->send(); $this->http_code = $parser->getStatus(); $this->http_info = $parser->getRawHeader(); $this->url = $uri; return $parser->getContents(); }
/** * @see Mars_3LeggedOAuthProvider::send() * @since 1.10.0 * @author Naomichi Yamakita <*****@*****.**> */ public function send($uri, $requestMethod = Mars_HttpRequest::HTTP_GET, $parameters = array(), $files = array()) { $uri = $this->buildEndpointURI($uri); $accessToken = $this->getAccessToken(); $sender = new Mars_HttpRequestSender($uri); $sender->setRequestMethod($requestMethod); $sender->addHeader('Authorization', 'OAuth ' . $accessToken['access_token']); $sender->addParameters($parameters); $sender->setPostFormat(Mars_HttpRequestSender::FORMAT_JSON); $parser = $sender->send(); if ($parser->getStatus() != 200) { if (stripos($parser->getContentType(), 'application/json') !== FALSE) { $data = $parser->getJSONData(TRUE); $error = sprintf('%s (%s)', $data['error'], $data['error_description']); } else { $error = $parser->getHeader('WWW-Authenticate'); } $message = sprintf('Failed to send API. [%s]', $error); throw new Mars_RequestException($message); } return $parser; }
/** * RESTful API に対してリクエストを送信します。 * パフォーマンス上の観点から、PHP の zlib モジュールが有効な場合はデータを gzip 圧縮転送します。 * * @param array $parameters 送信するパラメータのリスト。 * <code> * // 対象フィールドを foo、bar に指定 * $parameters = array('fields' => 'foo,bar'); * * // フィルタリングの指定 * $parameters = array('filterBy' => 'hasApp'); * </code> * @param string $requestMethod {@link Mars_OAuthProvider::send()} メソッドを参照。 * @return Mars_HttpResponseParser {@link Mars_OAuthProvider::send()} メソッドを参照。 * @throws Mars_RequestException mixi からエラーが返された場合に発生。 * - {@link Mars_RequestException::getCode()} メソッドでレスポンスコードが取得可能。(コードの意味は mixi のマニュアルを参照) * - OAuth の署名検証などでエラーが起きた場合は {@link http://oauth.pbworks.com/ProblemReporting 具体的な理由} が返される。 * - {@link Mars_RequestException::getAttribute() Mars_RequestException::getAttribute('error')} メソッドで返却されたレスポンスページを取得可能。 * @see Mars_OAuthProvider::send() * @link http://developer.mixi.co.jp/appli/spec/mob/for_partners/mobile_api_detail RESTful API 仕様 * @link http://developer.mixi.co.jp/appli/spec/mob/2-legged-oauth 2-legged OAuth による API アクセス */ public function send($uri, $requestMethod = Mars_HttpRequest::HTTP_GET, $parameters = array(), $files = array()) { $baseFeed = $this->buildEndpointURI($uri); $queryData = array(); if ($requestMethod == Mars_HttpRequest::HTTP_GET || $requestMethod == Mars_HttpRequest::HTTP_DELETE) { $queryData = $parameters; } $queryData['xoauth_requestor_id'] = Mars_MixiMobileApp::getOwnerId(); $request = OAuthRequest::from_consumer_and_token($this->_consumer, NULL, $requestMethod, $baseFeed, $queryData); $request->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), $this->_consumer, NULL); // to_header() から返されるヘッダ名 ('Authorization: ') の部分を取り除く $authorization = substr($request->to_header(), 15); $uri = $baseFeed . '?' . http_build_query($queryData, '', '&'); if ($requestMethod === Mars_HttpRequest::HTTP_POST) { $sender = new Mars_HttpRequestSender($uri); $sender->addParameters($parameters); $sender->setPostFormat(Mars_HttpRequestSender::FORMAT_JSON); } else { $sender = new Mars_HttpRequestSender($uri); } $sender->setRequestMethod($requestMethod); $sender->addHeader('Authorization', $authorization); // 圧縮転送を有効にする if ($this->_hasZlib) { $sender->addHeader('Accept-Encoding', 'gzip'); } $parser = $sender->send(); $status = $parser->getStatus(); if ($status == 200) { return $parser; } else { $authenticate = $parser->getHeader('WWW-Authenticate'); // OAuth の承認でエラーが起きた場合は oauth_problem に原因が格納される if (preg_match('/oauth_problem="([^"]+)"/', $authenticate, $matches)) { $message = sprintf('OAuth authenticate error. [%s]', $matches[1]); } else { $message = sprintf('mixi returned an error code. [%s]', $status); } $e = new Mars_RequestException($message, $status); $e->setAttribute('error', $parser->getContents()); throw $e; } }