Потребление остальных API из Oracle PLSQL возвращается ??? для арабских персонажей - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь вызвать спокойный API из моей процедуры Oracle. Во-первых, метод API имеет тип get, а не post, поэтому параметры отправляются через заголовок. основная цель API - отправлять полученные сообщения в виде SMS-сообщений некоторым провайдерам, а иногда и в арабском формате; Мы поняли, что полученные на арабском языке SMS непостижимы;

Итак, я создал тестовую процедуру, которая принимает сообщение и отправляет его в метод API тестирования, который возвращает то же сообщение, что и ответ.

Вызов API успешно выполнен, но ответ, только если используется арабский формат, выглядит как ����. Что следует добавить в мою процедуру, чтобы сообщения могли быть читаемыми? Я попытался использовать escape для сообщения и установить формат заголовка, как вы можете видеть в шаблоне ниже, но, к сожалению, ничего не получилось:

PROCEDURE TEST(lang       VARCHAR2, 
               message    VARCHAR2,
               P_RESPONSE OUT VARCHAR2) AS

    v_request         UTL_HTTP.req;
    v_response        UTL_HTTP.resp;
    v_text            VARCHAR2(1024);
    v_url             VARCHAR2(1024);
    v_message         VARCHAR2(1024);
    l_webservice_link VARCHAR2(128); 


  BEGIN
    BEGIN

      P_RESPONSE := '';
     v_message         := utl_url.escape(message);
      --v_message         :=utl_url.escape(message,false,'UTF-8');
      --v_message         :=utl_url.escape(message,false,'windows-1256');
      --v_message         :=utl_url.escape(message,false,'AL32UTF8');
      --v_message         :=utl_url.escape(message,false,'AR8MSWIN1256');

      l_webservice_link := GET_PARAM('REST_API_URL');

      v_url             := l_webservice_link || 
                           'Mytest?strMessage=' || v_message|| 
                           '&strLang=' || lang;

      v_request         := UTL_HTTP.begin_request(v_url);

      --UTL_HTTP.set_header(v_request, 'Content-Type', 'charset=UTF-8');
      --UTL_HTTP.set_header(v_request, 'Content-Type', 'windows-1256');

      v_response := UTL_HTTP.get_response(v_request);

      LOOP
        BEGIN
          UTL_HTTP.read_text(v_response, v_text);
          DBMS_OUTPUT.put_line(v_text);

        EXCEPTION
          WHEN UTL_HTTP.end_of_body THEN
            NULL;
        END;

        EXIT WHEN v_text IS NULL;
      END LOOP;

      UTL_HTTP.end_response(v_response);

      IF v_response.status_code <> 200 THEN
       P_RESPONSE := v_response.reason_phrase; 
      END IF;

    EXCEPTION
      WHEN OTHERS THEN
        P_RESPONSE := 'An error has occured: ' || SQLERRM;        
    END;

  END TEST;

Любая помощь более чем ценится.

1 Ответ

0 голосов
/ 17 января 2019

Попробуйте вставить этот код:

Charset VARCHAR2(20);

BEGIN

    SELECT UTL_I18N.MAP_CHARSET(VALUE)
    INTO Charset
    FROM nls_database_parameters
    WHERE parameter = 'NLS_CHARACTERSET';

UTL_HTTP.set_header(v_request, 'Content-Type', 'text/html; charset='||Charset);

Я не знаком с REST, не знаю, требуется ли и правильна ли text/html;.

Обновление

Я просто вижу, как ваша база данных задает для него AR8ASMO8X, у которого нет имени IANA (по крайней мере, не в соответствии с Oracle UTL_I18N.MAP_CHARSET)

В этом случае попробуйте

UTL_HTTP.set_header(v_request, 'Content-Type', 'text/html; charset=UTF-8');
UTL_HTTP.begin_request(CONVERT(v_url,'AL32UTF8'));

Скорее всего, сервер возвращает ответ в UTF-8 - будет наиболее распространенным, в противном случае проверьте заголовок ответа.

Тогда попробуйте это:

UTL_HTTP.SET_BODY_CHARSET(v_response, 'AL32UTF8');

Помимо всего вышеперечисленного, у вас также может быть проблема display , то есть внутри Oracle все будет хорошо, просто ваш клиент не сможет правильно отображать символы, см. OdbcConnection, возвращающий китайские символы как "?"

...