powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / UTL_HTTP отправить POST в UTF-8, база в Win-1251
15 сообщений из 15, страница 1 из 1
UTL_HTTP отправить POST в UTF-8, база в Win-1251
    #39560464
Здравствуйте.
Я чувствую, что у меня не хватает базового понимания работы с кодировками и с HTTP и мне стыдно. Помогите.
Oracle 10XE. Нужно посылать веб-серверу кириллические данные, но приходят, видимо, замещающие символы. Тестирую не на том сервисе, куда надо посылать, т.к. у них нет тестового режима, а на найденном на просторах интернета другом сервисе. Сервер получает от меня хрень:
http://prntscr.com/hg8nee

Код ниже:

Код: plsql
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.
31.
DECLARE
    l_clob           CLOB;
    http_req      UTL_HTTP.REQ;
    http_resp     UTL_HTTP.RESP;
    url_text      VARCHAR2(32767);
    lv_clob_length_bytes NUMBER;
    v_url                VARCHAR2(500 CHAR);
    v_content            VARCHAR2(100 CHAR);
BEGIN
    v_content := CONVERT('йцукенг', 'UTF8');   
    v_url := 'http://putsreq.com/iLm1LN52ApNwd2nIKt';
    http_req  := utl_http.begin_request(v_url, 'POST');
    utl_http.set_header(http_req, 'User-Agent', 'Mozilla/4.0');
    utl_http.set_body_charset(http_req, 'UTF8');
    utl_http.set_header(http_req, 'Content-Length', LENGTHC(v_content));
    utl_http.set_header(http_req, 'Content-Type',  'text/json;charset=utf-8');
    utl_http.write_text(http_req, v_content);
    http_resp := utl_http.get_response(http_req);
    LOOP
        BEGIN
            url_text := null;
            utl_http.read_line(http_resp, url_text, TRUE);
            l_clob := l_clob || url_text;
            EXCEPTION
                WHEN OTHERS THEN EXIT;
        END;
    END LOOP;
    UTL_HTTP.END_RESPONSE(http_resp);
dbms_output.put_line(l_clob);
END;
/
...
Рейтинг: 0 / 0
UTL_HTTP отправить POST в UTF-8, база в Win-1251
    #39560468
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Усталый разработчик,

Вместо write_text используй write_raw. Для конвертации - utl_i18n. Если исходный контент в clob-е, то dbms_lob.converttoblob.
...
Рейтинг: 0 / 0
UTL_HTTP отправить POST в UTF-8, база в Win-1251
    #39560469
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UTL_I18N.STRING_TO_RAW
...
Рейтинг: 0 / 0
UTL_HTTP отправить POST в UTF-8, база в Win-1251
    #39560479
Вот так? Всё равно пришёл мусор...

Код: plsql
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.
31.
DECLARE
    l_clob           CLOB;
    http_req      UTL_HTTP.REQ;
    http_resp     UTL_HTTP.RESP;
    url_text      VARCHAR2(32767);
    lv_clob_length_bytes NUMBER;
    v_url                VARCHAR2(500 CHAR);
    v_content            VARCHAR2(100 CHAR);
BEGIN
    v_content := 'йцукенг';   
    v_url := 'http://putsreq.com/ey7gCfEVYoq5qi0GZvA9';
    http_req  := utl_http.begin_request(v_url, 'POST');
    utl_http.set_header(http_req, 'User-Agent', 'Mozilla/4.0');
    utl_http.set_body_charset(http_req, 'UTF8');
    utl_http.set_header(http_req, 'Content-Length', LENGTHC(v_content));
    utl_http.set_header(http_req, 'Content-Type',  'text/json;charset=utf-8');
    utl_http.write_raw(http_req, UTL_I18N.STRING_TO_RAW(v_content));
    http_resp := utl_http.get_response(http_req);
    LOOP
        BEGIN
            url_text := null;
            utl_http.read_line(http_resp, url_text, TRUE);
            l_clob := l_clob || url_text;
            EXCEPTION
                WHEN OTHERS THEN EXIT;
        END;
    END LOOP;
    UTL_HTTP.END_RESPONSE(http_resp);
dbms_output.put_line(l_clob);
END;
/
...
Рейтинг: 0 / 0
UTL_HTTP отправить POST в UTF-8, база в Win-1251
    #39560483
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Усталый разработчикВот так? Всё равно пришёл мусор...1) Ты не указал конвертору целевую кодировку.
2) when utl_http.end_of_body then.
...
Рейтинг: 0 / 0
UTL_HTTP отправить POST в UTF-8, база в Win-1251
    #39560494
1. Точно, поспешишь - людей насмешишь, указываю UTF8 теперь
2. Понял, добавил
Что-то всё ещё не получается...

Код: plsql
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.
31.
32.
DECLARE
    l_clob           CLOB;
    http_req      UTL_HTTP.REQ;
    http_resp     UTL_HTTP.RESP;
    url_text      VARCHAR2(32767);
    lv_clob_length_bytes NUMBER;
    v_url                VARCHAR2(500 CHAR);
    v_content            VARCHAR2(100 CHAR);
BEGIN
    v_content := 'йцукенг';   
    v_url := 'http://putsreq.com/ey7gCfEVYoq5qi0GZvA9';
    http_req  := utl_http.begin_request(v_url, 'POST');
    utl_http.set_header(http_req, 'User-Agent', 'Mozilla/4.0');
    utl_http.set_body_charset(http_req, 'UTF8');
    utl_http.set_header(http_req, 'Content-Length', LENGTHC(v_content));
    utl_http.set_header(http_req, 'Content-Type',  'text/json;charset=utf-8');
    utl_http.write_raw(http_req, UTL_I18N.STRING_TO_RAW(v_content,'UTF8'));
    http_resp := utl_http.get_response(http_req);
    LOOP
        BEGIN
            url_text := null;
            utl_http.read_line(http_resp, url_text, TRUE);
            l_clob := l_clob || url_text;
        EXCEPTION
                WHEN UTL_HTTP.END_OF_BODY THEN 
                     UTL_HTTP.END_RESPONSE(http_resp);                     
                WHEN OTHERS THEN EXIT;
        END;
    END LOOP;
dbms_output.put_line(l_clob);
END;
/
...
Рейтинг: 0 / 0
UTL_HTTP отправить POST в UTF-8, база в Win-1251
    #39560496
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Усталый разработчикЧто-то всё ещё не получается...Что конкретно?
...
Рейтинг: 0 / 0
UTL_HTTP отправить POST в UTF-8, база в Win-1251
    #39560497
Сервер всё ещё получает мусор, т.е., какие-то замещающие символы. Как на скрине из первого поста.
...
Рейтинг: 0 / 0
UTL_HTTP отправить POST в UTF-8, база в Win-1251
    #39560503
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Acl-ы не позволяют мне поиграться.
Вот тут ты пишешь исходный размер контента до конвертации.
Усталый разработчик
Код: plsql
1.
utl_http.set_header(http_req, 'Content-Length', LENGTHC(v_content));
...
Рейтинг: 0 / 0
UTL_HTTP отправить POST в UTF-8, база в Win-1251
    #39560515
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Усталый разработчик
Код: plsql
1.
    v_content := CONVERT('йцукенг', 'UTF8');   

Выкинь. И вообще не пользуйся никогда этим конвертом.
И длину правильно посчитай.
...
Рейтинг: 0 / 0
UTL_HTTP отправить POST в UTF-8, база в Win-1251
    #39560549
Elic, о, я вас ждал, я видел, вы часто помогаете про UTL_HTTP.
И при том, что я читал ряд тем, к моему стыду, я прошляпил длину.
Конверт я уже выкинул, как видите по последним постам.
Сделал так, но всё равно мусор:
Код: plsql
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.
31.
32.
33.
34.
DECLARE
    l_clob           CLOB;
    http_req      UTL_HTTP.REQ;
    http_resp     UTL_HTTP.RESP;
    url_text      VARCHAR2(32767);
    lv_clob_length_bytes NUMBER;
    v_url                VARCHAR2(500 CHAR);
    v_content            VARCHAR2(100 CHAR);
    v_raw_content        RAW(1000);
BEGIN
    v_content := 'йцукенг';   
    v_raw_content := UTL_I18N.STRING_TO_RAW(v_content,'UTF8');    
    v_url := 'http://putsreq.com/ey7gCfEVYoq5qi0GZvA9';
    http_req  := utl_http.begin_request(v_url, 'POST');
    utl_http.set_header(http_req, 'User-Agent', 'Mozilla/4.0');
    utl_http.set_body_charset(http_req, 'UTF-8');
    utl_http.set_header(http_req, 'Content-Length', utl_raw.length(v_raw_content));
    utl_http.set_header(http_req, 'Content-Type',  'text/json;charset=utf-8');
    utl_http.write_raw(http_req, v_raw_content);
    http_resp := utl_http.get_response(http_req);
    LOOP
        BEGIN
            url_text := null;
            utl_http.read_line(http_resp, url_text, TRUE);
            l_clob := l_clob || url_text;
        EXCEPTION
                WHEN UTL_HTTP.END_OF_BODY THEN 
                     UTL_HTTP.END_RESPONSE(http_resp);                     
                WHEN OTHERS THEN EXIT;
        END;
    END LOOP;
dbms_output.put_line(l_clob);
END;
/



Я правильно посчитал длину теперь?
...
Рейтинг: 0 / 0
UTL_HTTP отправить POST в UTF-8, база в Win-1251
    #39560564
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Усталый разработчик
Код: plsql
1.
2.
3.
4.
    utl_http.set_body_charset(http_req, 'UTF-8');
    utl_http.set_header(http_req, 'Content-Length', utl_raw.length(v_raw_content));
    utl_http.set_header(http_req, 'Content-Type',  'text/json;charset=utf-8');
    utl_http.write_raw(http_req, v_raw_content);

Оно умеет само конвертировать. Зачем мучаться, повторяя этот процесс.
Код: plsql
1.
2.
3.
4.
    utl_http.set_body_charset(http_req, 'UTF-8');
    utl_http.set_header(http_req, 'Transfer-Encoding', 'chunked');
    utl_http.set_header(http_req, 'Content-Type',  'text/json;charset=utf-8');
    utl_http.write_text(http_req, v_content);
...
Рейтинг: 0 / 0
UTL_HTTP отправить POST в UTF-8, база в Win-1251
    #39560638
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Усталый разработчик,

А шрифт, которым пользуются разработчики этого putsreq.com русские буквы поддерживает?
...
Рейтинг: 0 / 0
UTL_HTTP отправить POST в UTF-8, база в Win-1251
    #39560834
Elic[/src]Оно умеет само конвертировать. Зачем мучаться, повторяя этот процесс.
Код: plsql
1.
2.
3.
4.
    utl_http.set_body_charset(http_req, 'UTF-8');
    utl_http.set_header(http_req, 'Transfer-Encoding', 'chunked');
    utl_http.set_header(http_req, 'Content-Type',  'text/json;charset=utf-8');
    utl_http.write_text(http_req, v_content);

[/quot]
Elic, огромное человеческое спасибо. Заработало.
...
Рейтинг: 0 / 0
UTL_HTTP отправить POST в UTF-8, база в Win-1251
    #39591042
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бился с передачей и получением из сервиса юникода-16 (кторый в nvarchar и nclob) сама БД в 1521.
получилось только так
utl_http.write_raw(vHttpRequest, utl_raw.cast_to_raw(convert(dbms_lob.substr(vRequestBody, 2000, 1),'UTF8', vNCharset)));
но как-то наворочено, может простое решение на нашел?


Код: plsql
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
--create table TMP_NVAR(text nclob) -- тестовый запрос  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetData xmlns="http://tempuri.org/"><value>ййй&#197;&#197;</value></GetData></s:Body></s:Envelope>
--create table TMP_NVAR2(text nclob) -- ответ

declare
   vHttpRequest    utl_http.req;
   vHttpResponse   utl_http.resp;   
   vRequestBody   nclob;       
   vResponse       nclob;       
   vNCharset varchar2(256);
begin    
      select VALUE into vNCharset
        from NLS_DATABASE_PARAMETERS 
       where PARAMETER='NLS_NCHAR_CHARACTERSET';

   utl_http.set_proxy('http://localhost:8888'); -- fiddler
   utl_http.set_transfer_timeout (600);
   utl_http.set_response_error_check(enable => true);
   utl_http.set_detailed_excp_support(enable => true);
   
   select text into vRequestBody from tmp_nvar;  -- <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetData xmlns="http://tempuri.org/"><value>ййй&#197;&#197;</value></GetData></s:Body></s:Envelope>          
            
   vHttpRequest := utl_http.begin_request(url => 'http://localhost:8080/hello', method => 'POST');
   utl_http.set_header(vHttpRequest, 'SOAPAction',  '"http://tempuri.org/IService1/GetData"');      
   utl_http.set_header(vHttpRequest, 'Content-Type',   'text/xml;charset=utf-8');
   utl_http.set_header(vHttpRequest, 'Content-Length', dbms_lob.GetLength(vRequestBody));
   utl_http.set_header(vHttpRequest, 'Transfer-Encoding', 'chunked');


--  utl_http.write_raw(vHttpRequest, UTL_I18N.STRING_TO_RAW(vRequestBody,'UTF8'));
   utl_http.write_raw(vHttpRequest, utl_raw.cast_to_raw(convert(dbms_lob.substr(vRequestBody, 2000, 1),'UTF8', vNCharset)));

--  utl_http.write_text(vHttpRequest, vRequestBody);            
 

   vHttpResponse := utl_http.get_response(vHttpRequest);
   utl_http.read_text(vHttpResponse, vResponse, 2000);   
   delete TMP_NVAR2;
   insert into TMP_NVAR2(TEXT)
   values(vResponse);
   commit;
   utl_http.end_response(vHttpResponse);
end;   
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / UTL_HTTP отправить POST в UTF-8, база в Win-1251
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]