0

サーバーからデータを取得するために TRestRequest を使用しています。パラメータに Unicode 文字列値"ôpen"を入力する必要があります。ただし、クエリ パラメータとしてこの Unicode 文字列を使用して Execute を呼び出すと、クラッシュが発生します。

私のコード:

    RESTRequest->ResetToDefaults();
    RESTRequest->AddParameter("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8 ", TRESTRequestParameterKind::pkHTTPHEADER);
    //  Get Indexing Status
    RESTRequest->Resource = "XXX/collection1"+ Form1->teReuqestHandler->Text+"?";
    RESTRequest->Method = rmGET;
    // replace all space in name field with '\ '
    UnicodeString lcQuery = Form1->teQuery->Text; // this value should be support french language or ...
    // Body
    RESTRequest->AddParameter("q",lcQuery, TRESTRequestParameterKind::pkGETorPOST);
    // Run
    String str1 = RESTRequest->GetFullRequestURL();
    RESTRequest->Execute(); // here when pass "ôpen" to lcQuery, it crash

URL に「ôpen」を正しく追加するにはどうすればよいですか?

4

1 に答える 1

0

Content-Type: application/x-www-form-urlencoded; charset=UTF-8HTTP ヘッダーは、リクエスト内でのみ意味があり、リクエスト内では意味がありませGETPOST

Embarcadero の REST フレームワークは、ASCII 以外の文字セットを正しく処理しません。内部で Indy を使用していますが、Indy の文字セット処理は使用していません。そのため、UTF-8 でエンコードされたデータを送信するには、次のいずれかを行う必要があります。

  1. a を手動で UTF-8 にエンコードしてUnicodeStringから、UTF-8 オクテットを a に戻して送信できるUnicodeStringようにします。TRESTRequest

    UnicodeString EncodeAsUtf8(const UnicodeString &s)
    {
        UTF8String utf8 = s;
        UnicodeString ret;
        ret.SetLength(utf8.Length());
        for (int x = 1; x <= utf8.Length(); ++x)
            ret[x] = (WideChar) utf8[x];
        return ret;
    }
    
    ...
    
    RESTRequest->ResetToDefaults();
    RESTRequest->Method = rmGET;
    RESTRequest->Resource = L"XXX/collection1" + Form1->teReuqestHandler->Text;
    RESTRequest->AddParameter(L"q", EncodeAsUtf8(Form1->teQuery->Text), TRESTRequestParameterKind::pkGETorPOST);
    String str1 = RESTRequest->GetFullRequestURL();
    RESTRequest->Execute();
    
  2. パラメータ データを自分でエンコードします。

    #include <IdGlobal.hpp>
    #include <IdURI.hpp>
    
    RESTRequest->ResetToDefaults();
    RESTRequest->Method = rmGET;
    RESTRequest->Resource = L"XXX/collection1" + Form1->teReuqestHandler->Text;
    RESTRequest->AddParameter(L"q", TIdURI::ParamsEncode(Form1->teQuery->Text, IndyTextEncoding_UTF8), TRESTRequestParameterKind::pkGETorPOST, TRESTRequestParameterOptions() << TRESTRequestParameterOption::poDoNotEncode);
    String str1 = RESTRequest->GetFullRequestURL();
    RESTRequest->Execute();
    

    または:

    #include <IdGlobal.hpp>
    #include <IdURI.hpp>
    
    RESTRequest->ResetToDefaults();
    RESTRequest->Method = rmGET;
    RESTRequest->Resource = L"XXX/collection1" + Form1->teReuqestHandler->Text + L"?q={q}";
    RESTRequest->AddParameter(L"q", TIdURI::ParamsEncode(Form1->teQuery->Text, IndyTextEncoding_UTF8), TRESTRequestParameterKind::pkURLSEGMENT, TRESTRequestParameterOptions() << TRESTRequestParameterOption::poDoNotEncode);
    String str1 = RESTRequest->GetFullRequestURL();
    RESTRequest->Execute();
    

TIdHTTPそれ以外の場合は、Indy のコンポーネントに切り替えます。

UnicodeString Response = IdHTTP1->Get(L"http://server/XXX/collection1" + Form1->teReuqestHandler->Text + L"?q=" + TIdURI::ParamsEncode(Form1->teQuery->Text, IndyTextEncoding_UTF8));
于 2015-02-26T19:48:04.873 に答える