Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / UTL_HTTP отправить POST в UTF-8, база в Win-1251 / 15 сообщений из 15, страница 1 из 1
28.11.2017, 12:23
    #39560464
UTL_HTTP отправить POST в UTF-8, база в Win-1251
Здравствуйте.
Я чувствую, что у меня не хватает базового понимания работы с кодировками и с 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
28.11.2017, 12:27
    #39560468
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTL_HTTP отправить POST в UTF-8, база в Win-1251
Усталый разработчик,

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

Код: 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
28.11.2017, 12:42
    #39560483
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTL_HTTP отправить POST в UTF-8, база в Win-1251
Усталый разработчикВот так? Всё равно пришёл мусор...1) Ты не указал конвертору целевую кодировку.
2) when utl_http.end_of_body then.
...
Рейтинг: 0 / 0
28.11.2017, 12:52
    #39560494
UTL_HTTP отправить POST в UTF-8, база в Win-1251
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
28.11.2017, 12:54
    #39560496
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTL_HTTP отправить POST в UTF-8, база в Win-1251
Усталый разработчикЧто-то всё ещё не получается...Что конкретно?
...
Рейтинг: 0 / 0
28.11.2017, 12:55
    #39560497
UTL_HTTP отправить POST в UTF-8, база в Win-1251
Сервер всё ещё получает мусор, т.е., какие-то замещающие символы. Как на скрине из первого поста.
...
Рейтинг: 0 / 0
28.11.2017, 13:03
    #39560503
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTL_HTTP отправить POST в UTF-8, база в Win-1251
Acl-ы не позволяют мне поиграться.
Вот тут ты пишешь исходный размер контента до конвертации.
Усталый разработчик
Код: plsql
1.
utl_http.set_header(http_req, 'Content-Length', LENGTHC(v_content));
...
Рейтинг: 0 / 0
28.11.2017, 13:16
    #39560515
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTL_HTTP отправить POST в UTF-8, база в Win-1251
Усталый разработчик
Код: plsql
1.
    v_content := CONVERT('йцукенг', 'UTF8');   

Выкинь. И вообще не пользуйся никогда этим конвертом.
И длину правильно посчитай.
...
Рейтинг: 0 / 0
28.11.2017, 13:57
    #39560549
UTL_HTTP отправить POST в UTF-8, база в Win-1251
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
28.11.2017, 14:18
    #39560564
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTL_HTTP отправить POST в UTF-8, база в Win-1251
Усталый разработчик
Код: 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
28.11.2017, 15:35
    #39560638
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTL_HTTP отправить POST в UTF-8, база в Win-1251
Усталый разработчик,

А шрифт, которым пользуются разработчики этого putsreq.com русские буквы поддерживает?
...
Рейтинг: 0 / 0
28.11.2017, 19:44
    #39560834
UTL_HTTP отправить POST в UTF-8, база в Win-1251
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
25.01.2018, 15:49
    #39591042
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTL_HTTP отправить POST в UTF-8, база в Win-1251
бился с передачей и получением из сервиса юникода-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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / UTL_HTTP отправить POST в UTF-8, база в Win-1251 / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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