2017-07-05 14 views
0

現在、Delphi/LazarusプログラムでHTTP/HTTPsリクエストにmacOS APIを使用するコードを実装しています。リダイレクトを受け付けないNSUrlConnection同期リクエスト

コードは独自のスレッド(つまりメイン/ユーザスレッドではない)で実行され、Windows/MacとDelphi/Lazarusのスレッドベースのクローラの一部です。私はOS APIを使って実際のHTTP/Sリクエスト部分を実装しようとしますが、例えば、 HTTPヘッダーを自分自身で処理し、処理します。

これは可能な場合は同期モードを使い続けたいと考えています。

サーバーから返された内容を単純に返信して欲しいです。

I にリダイレクトする必要はありません。

私は現在、sendSynchroniousRequest_returningResponse_error

は、私はGoogleの検索しようとしている使用していますが、同期要求を使用して方法がないようですか?ちょっと変わったようです。

+0

[アララット・シナプス](https://sourceforge.net/projects/synalist/)は同期通信用です:http://www.ararat.cz/synapse/doku.php/about – Abelisto

+0

ありがとう - Indyも既に実装していますが、IndyとSynapseの両方のOpenSSL依存関係から抜け出そうとしています。最近のOSXバージョンに同梱されているOpenSSLライブラリは、CloudFlare SSL証明書を使用するWebサイトでは機能しません。 (OpenSSLを自分自身で配布することも可能だが、むしろOpenSSLをインストールするためにユーザーに任せておくのは難しい) - これはWindows上の私がWinInet/IE(AJAXの後者)をサポートしている理由と、ネイティブMac APIを通じてHTTP/HTTPSをサポートするための作業 – Tom

+0

LazarusでTHTTPClientを使用できませんか? –

答えて

1

いいえ、NSURLConnectionの同期機能は非常に制限されており、非常に推奨されていないため拡張されませんでした。つまり、あなたがしようとしていることを技術的に実装することは可能です。

私の想い出は、そのメソッドをNSURLSessionに一度置き換えたことから(バイナリのみのライブラリでそのメソッドのあまりリークのない置換を取り除くために)、基本的に共有辞書を使用するメソッドを書く必要があるということですNSURLSessionDataTaskごとにセマフォを格納します(データタスクをキーとして使用)。次に、セマフォのカウントをゼロに設定して、待機してすぐにブロックし、メインスレッドで非同期で非同期要求を開始し、(現在のスレッドで)セマフォを待機します。非同期データタスクの完了ハンドラブロックでは、セマフォをインクリメントし、呼び出しスレッドのブロックを解除します。

このトリックは、セッションが現在のスレッド以外のスレッド(セマフォの待機をブロックしているスレッド)でコールバックを確実に実行するようにすることです。したがって、実際にデータタスクを開始するときは、メインスレッドにdispatch_asyncを設定する必要があります。

タスクを関連するデリゲートメソッドでダウンロードタスクまたはストリームタスクに変換することをサポートしている場合は、共有ディクショナリも同様に更新する必要がありますが、その機能を使用してください。 :-)

+0

upvotedと賞を与えられた - 私の問題をより簡単に解決する答えの小さな希望のためにまだ閉じていない。今、私はLazarusの代理人を "objective-pascal"で使う方法を理解しようとしています。それが解決されたら、私はあなたのように同様の行に移ります。 (すでに仕事を始め、私を抱きしめている問題や時間を委任しますが、それはいつかは完全に解決されると思います) – Tom

+0

ブロックが簡単な場合は、上記のことを行うこともできますが、AFNetworkingクラスデリゲートメソッドの代わりにリダイレクトを処理するブロックを提供します。 – dgatwood

関連する問題