気まま日記(kimamanikki)

気の向くままに、のんびり更新しますヽ(´∀`)ノ

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
06


スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PHP経由でクロスドメインにアクセスする方法

とりあえず忘れないようにメモ。

WebサービスのAPIとかを利用する際に、JavaScriptによる非同期通信(Ajax)で通信しようとすると、必ずと言っていいほどクロスドメインの問題にぶち当たる。

最近ではJSONPに対応しているAPIも多くなってきたが、それでもまだSOAPRESTによる、XML通信が大半を占めているのが現状である。

戻り値がJSONPによる通信の場合はクロスドメインを意識しないで済むが、そうじゃない場合はそうはいかない。

つまり、別ドメインの場合はJSONPを使用しない限りは、JavaScriptのみでのAjax通信は不可能ということになる。(ブラウザの仕様)

Ajax通信(ドメインA)→○→Webサービス(ドメインA)
Ajax通信(ドメインA)→×→Webサービス(ドメインB)


この場合、Ajaxを利用して別ドメインのWebサービスを利用しようとした場合、CGIやPHP等を使用して、別ドメインとの通信を肩代わりさせてやる必要がある。

Ajax通信(ドメインA)→×→Webサービス(ドメインB)
Ajax通信(ドメインA)→PHPまたはCGIによる通信(ドメインA)→○→Webサービス(ドメインB)


その場合のサンプルがこちら。
※サンプルはPHPを使用しています。
CGIは触ったことがあまりないのでぶっちゃけ分からないというのと、パーミッションの設定等々ややこしそうなので、PHPによるサンプルとしています。
また、JavaScriptのソースにはJKL.ParseXMLを使用しています。

connect.php
<?php
$url = $_GET['request'];
header("Content-type: application/xml; charset=UTF-8");
readfile($url);
?>

このconnect.phpを自分のドメインへ配置し、Ajaxエンジンでのリクエストパスを

var ajax = new JKL.ParseXML('http://****/WebServiceAPIへのURL');
ajax.async(new function (data) {
	// レスポンス返却時の処理
});
ajax.parse();

から

var ajax = new JKL.ParseXML('connect.php?request=http://****/WebServiceAPIへのURL');
ajax.async(new function (data) {
	// レスポンス返却時の処理
});
ajax.parse();

とするだけで、クロスドメインの問題は解消される。

ついでに、リクエストパラメータで2バイト文字の日本語を送信する場合、必ずと言っていいほど文字化けに悩まされる。

まぁ慣れてる人は「いつものことか」と思うだろうが、慣れてない人にはつい「うっかり」起こしてしまう現象なのだ。

ということで、2バイト文字を送信する際の注意点。

1.エンコードを意識する
これは当然の話。
クライアント(JavaScriptおよびHTML)のエンコードが『Shift-JIS』で、Webサービス側が『EUC-JP』とかだったら・・・((((;゜Д゜)))ガクガクブルブル
まぁ殆どが『Shift-JIS』か『UTF-8』だと思うので、そこはしっかり確認しておこう。
(ちなみに自分が色々と触ってみたり見たりしたところ、UTF-8の方が多い気がした)

ついでにPHPでのサンプルはこちら。

$param = $_GET['param'];
// paramをUTF-8にエンコード
$param = mb_convert_encoding($param, 'UTF-8', 'auto');

2.URLエンコードを行う
クライアントの意図した値(クライアントが入力した2バイト文字)をWebサービス側に正しく送信するためには、必ず必要な処理である。
※詳しくはこちらを参照

サンプル(PHP)はこちら。

// 2バイト文字をURLエンコード
$param= urlencode($param); 

この処理を行うことによって、2バイト文字を正しく処理することができる。


Comments

Leave a Comment


Body

カウンター
セルフィ

 
Twitter



 
 
クラッチ作品集
 
 
プロフィール

クラッチ

気まま日記バナー

・クラッチ
このブログの管理人

 
 
管理人へメール
メールフォームを開く
 
 
ブロとも申請フォーム
 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。