Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
AntMaria
Member

Откуда:
Сообщений: 12
Отправляем из SQL (Microsoft SQL Server 2005) xml-файл при помощи WinHttp - уходит в неправильной кодировке UTF-8, а должно в windows-1251.
файл принимают - отправляют нам ответ - пишут что приходит от нас в кодировке UTF-8.
Где-то прочитала, что по умолчанию WinHttp всё отправляет в кодировке UTF-8. Как решить проблему?

+
DECLARE @filename varchar(100)
DECLARE @fileresp varchar(100)
DECLARE @ReqBody nvarchar(4000)

DECLARE @result varchar(8000)
DECLARE @fDateResponse datetime
DECLARE @fRequestOID varchar(100)
DECLARE @fClientOID varchar(100)
DECLARE @fOperator varchar(100)

DECLARE @addr varchar(100)

declare @user varchar(100)
declare @pwd varchar(100)
declare @RequestHeader varchar(100)
declare @boundary varchar(100)

DECLARE @proxy varchar(100)
DECLARE @proxySettings varchar(100)
Declare @len int
declare @str varchar(50)
set @fDateResponse ='11.08.2014 15:53:46'
set @fRequestOID= '8170010088861369'
set @fClientOID='8050010088861387'
set @fOperator='20010060994737'

set @filename='C:\NBKI\8050010088861387_res.txt'
set @fileresp='C:\NBKI\8050010088861387_CP.c'
--содержимое запроса - xml файл
set @ReqBody =N'<?xml version="1.0" encoding="windows-1251"?>
<product>
<prequest>
<req>
<AddressReq>
<street>Ибрагимова</street>
<houseNumber>28а</houseNumber>
<apartment>73</apartment>
<city>Казань</city>
<prov>16</prov>
<postal>420080</postal>
<countryCode>RU</countryCode>
<addressType>1</addressType>
</AddressReq>
...
--- и так далее
...
<OutputFormat>XML</OutputFormat>
<lang>ru</lang>
</req>
</prequest>
</product>'

SET @addr='https://icrs.demo.nbki.ru/products/B2BRequestServlet'
SET @user = 'ffff'
SET @pwd='cccc123'

SET @RequestHeader = 'text/xml;charset=windows-1251;'

--Подготовка запроса
DECLARE @objHTTP int
DECLARE @rc bigint

EXEC @rc=sp_OACreate 'WinHttp.WinHttpRequest.5.1', @objHTTP OUTPUT 
EXEC @rc=sp_OAMethod @objHTTP,'open', null,'POST',@addr ,'false' 
EXEC @rc=sp_OAMethod @objHTTP,'setRequestHeader',null,'Content-Type', @RequestHeader 
set @len = DATALENGTH(@ReqBody)
EXEC @rc = sp_OAMethod @objHTTP, 'setRequestHeader', null, 'Content-Length', @len

/*ВСтавка была сделана по поводу неправильной отправки - от нас уходит в ЮНИКОДЕ, а должно ASCII
declare @accept  varchar(100)
SET @accept = 'charset=windows-1251;'
EXEC @rc = sp_OAMethod @objHTTP, 'setRequestHeader', null, 'accept-charset',@accept */
/*здесь убрала адрес*/
set @proxySettings = '192.$$$.$$$.$:$$$$'
EXEC @rc = sp_OAMethod @objHTTP, 'setProxy', NULL,  2, @proxySettings

SET @str = 'SetCredentials("' + @user + '","' + @pwd + '",1)' 
EXEC @rc = sp_OAMethod  @objHTTP , @str  

--Отправка запроса
exec @rc=sp_OAMethod @objHTTP,'Send',null,@ReqBody 
select @rc as 'send',@ReqBody  as '@ReqBody' 

if  @rc!=0 
	begin
	  set @result='error_send' --'Ошибка метода SEND:'+cast(@rc as varchar(100)) ---1
	  --exec sp_OADestroy @objHTTP
	end

Declare @status int
EXEC @rc = sp_OAGetProperty  @objHttp, 'status', @status OUTPUT  -- статус запроса
select @rc as 'RC', @status as 'status'
if @status <> 200
   begin
    set @result='error_status' --'Ошибка HTTP. Статус '+cast(@status as varchar(100)) ---1
	--exec sp_OADestroy @objHTTP
   end

if object_id('CreditRequest..BKITempFiles') is null
create table CreditRequest..BKITempFiles
(spid int,
 crc int,
 data VARCHAR(8000))

declare @crc int
select @crc = checksum(newid())

create table #t
(field VARCHAR(8000))

insert into #t
EXEC sp_OAGetProperty  @objHttp, 'ResponseBody'--'responsetext' 

select field  from #t

insert CreditRequest..BKITempFiles
select @@spid,@crc,field
from #t

select field as 'result2' from #t

declare @FS int
declare @FileID int

--функция sp_OACreate создаёт OLE объект 'Scripting.FileSystemObject'------------------
EXEC @rc = sp_OACreate 'Scripting.FileSystemObject', @FS OUTPUT
 
declare @c varchar(6000)
set @c = 'bcp.exe "select data from CreditRequest..BKITempFiles where spid = '+ cast(@@spid as varchar(20))+' and crc = '+cast(@crc as varchar(20)) + '" queryout "'+@FileName+'" -S CREDITREQUEST\CR05 -T -c -C RAW'
select @c as '@C',@FileName as '@FileName'
execute master.dbo.xp_cmdshell @c , no_output
select @c as '@C2'
--delete from EnergoSource..BKITempFiles where spid = @@spid and crc = @crc
 
-----------------------------расшифруем ответ---------------------------------------
declare @sCommand varchar(250)
set @sCommand = 'C:\crypto\cryptcp -decr -dn "Тестовый - 2014,support@$$$$.ru" -start "' + @filename + '" "' + @fileresp+'"'
exec @rc = xp_cmdshell @sCommand , no_output
select @rc as 'RC', @sCommand as ' @sCommand' 
------------------------------прочитаем ответ и передадим его обратно---------------
declare @FileOUT int
EXEC @rc = sp_OAMethod @FS, 'OpenTextFile', @FileOUT OUTPUT, @fileresp, 1, 0
select @rc as 'RC', @FS as '@FS', @FileOUT as '@FileOUT'

IF @rc <> 0 
	BEGIN
		select 'error_read_file' as 'result'
	END
delete #t
insert into #t
EXEC sp_OAMethod @FileOUT, 'ReadAll'--, @result OUTPUT 

--очистим за собой всяческий OLE-мусор----------------------------------------------
EXEC @rc = sp_OADestroy @FileID
--EXEC @rc = sp_OADestroy @FileOUT
EXEC @rc = sp_OADestroy @FS
exec sp_OADestroy @objHTTP
exec sp_OADestroy @status
exec sp_OADestroy @rc
exec sp_OADestroy @FileID
exec sp_OADestroy @FS
exec sp_OADestroy @FileOUT

select @result = field  from #t 

if DATALENGTH(@result)>0 --если пустой ответ,то не записываем в таблицу
begin
	insert User_EnergoBKITableResponse(DateResponse,RequestOID,ClientOID,Response,Operator)
	select @fDateResponse,@fRequestOID,@fClientOID, @result ,@fOperator
end
select field as 'result' from #t 

drop table #t


Сообщение было отредактировано: 25 сен 14, 17:02
25 сен 14, 11:40    [16620124]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
http://msdn.microsoft.com/en-us/library/windows/desktop/aa383998(v=vs.85).aspxвроде говорят что опции кодовая страница можно задать
25 сен 14, 12:12    [16620353]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
WinHttpRequestOption_URLCodePage
Sets or retrieves a VARIANT that identifies the code page for the URL string. The default value is the UTF-8 code page. The code page is used to convert the Unicode URL string, passed in the Open method, to a single-byte string representation.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa384108(v=vs.85).aspx
25 сен 14, 12:13    [16620361]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
Диам
Member

Откуда:
Сообщений: 1490
AntMaria, оставьте свой адрес или напишите на forMyWork@mail.ru
Мне тоже предстоит задача отправки данных в НБКИ через b2b интерфейс
25 сен 14, 13:53    [16620962]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
AntMaria
Member

Откуда:
Сообщений: 12
Maxx,
Добавила :
EXEC @rc=sp_OAMethod @objHTTP,'Option', null,2,'windows-1251;'

выдает номер кодовой страницы:65001 - т.е. UTF-8
А вот менять не менят... Вопрос тот же: КАК поменять?
25 сен 14, 16:10    [16621854]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
AntMaria, я честно ниче такого никогджа не делал ,но исходя из
автор
HRESULT put_Option(
[in] WinHttpRequestOption Option,
[in] VARIANT Value
);

HRESULT get_Option(
[in] WinHttpRequestOption Option,
[out, retval] VARIANT *Value
);

и далее по тексту
автор
//varUserAgent is L"A WinHttpRequest Example Program");
hr = pIWinHttpRequest->put_Option(


по идее нужно попробовать сделать тоже самое через

AntMaria
EXEC @rc=sp_OAMethod @objHTTP,'Option', null,2,'windows-1251;'


Но у вас видимо вызываеться get_Option
25 сен 14, 16:17    [16621887]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
AntMaria
Member

Откуда:
Сообщений: 12
Диам,
тут выложен практически рабочий вариант - осталось решить вот эту проблему, ну и потом ответный xml-файл обработать. Сейчас приходит вот в таком виде:

<?xml version="1.0" encoding="windows-1251" ?>
- <product>
- <prequest>
- <req>
- <AddressReq>
<houseNumber>28Р°</houseNumber>
<street>Р?Р±СІР°Р?РёР?Р?жа</street>
<apartment>73</apartment>
<city>Р?азаеѺ</city>
<prov>16</prov>
<postal>420080</postal>
<countryCode>RU</countryCode>
<addressType>1</addressType>
</AddressReq>
- <AddressReq>
<houseNumber>28Р°</houseNumber>
<street>Р?Р±СІР°Р?РёР?Р?жа</street>
<apartment>73</apartment>
<city>Р?азаеѺ</city>
<prov>16</prov>
<postal>420080</postal>
<countryCode />
<addressType>2</addressType>
</AddressReq>
- <IdReq>
<idNum>147505</idNum>
<idType>21</idType>
<seriesNumber>7100</seriesNumber>
<issueCountry>Р?Р?Р?Рѕ РёР?Р? Р?Р?СІР?Р?Р° Р?Р?Р±Р?лѺѳР?Р° Р?С»Р?Рµ</issueCountry>
<issueDate>2000-05-11+04:00</issueDate>
<issueAuthority>Р?Р?Р?Рѕ РёР?Р? Р?Р?СІР?Р?Р° Р?Р?Р±Р?лѺѳР?Р° Р?С»Р?ееѳР?Р?Р№ Р?блаѳС?Рё Р Р?СіСіРёСї</issueAuthority>
</IdReq>
- <InquiryReq>
<inqPurpose>09</inqPurpose>
<inqAmount>70000</inqAmount>
<currencyCode>RUB</currencyCode>
</InquiryReq>
- <PersonReq>
<name1>РѕР?РёРµР?СїР?</name1>
<first>Р?Р°Р?ежР?Р°</first>
<paternal>Р?РµС?СІР?жеа</paternal>
<gender>2</gender>
<nationality>RU</nationality>
<birthDt>1955-03-30+04:00</birthDt>
<placeOfBirth>СІ.Р?. Р?аиеѳР? ЧелеиеѳР?Р?Р?Р? ѲайР?еа Р Р?</placeOfBirth>
</PersonReq>
- <RequestorReq>
<MemberCode>наш код</MemberCode>
<UserID>наш пользователь</UserID>
<Password>наш пароль</Password>
</RequestorReq>
- <RefReq>
<product>CHST</product>
</RefReq>
<IOType>B2B</IOType>
<OutputFormat>XML</OutputFormat>
<lang>ru</lang>
</req>
</prequest>
- <preply>
- <err>
- <ctErr>
<Code>006</Code>
<Text>Некорректное значения для элемента "Кем выдано осн.удост-ние личности"</Text>
</ctErr>
</err>
</preply>
</product>

Причем текст ошибки от них приходит в нормальном виде, а наша информация вся в абракадабриках...
25 сен 14, 16:20    [16621905]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
Glory
Member

Откуда:
Сообщений: 104751
AntMaria
тут выложен практически рабочий вариант - осталось решить вот эту проблему, ну и потом ответный xml-файл обработать.

Ваш вопрос не про MSSQL, а о программировании WinHttpRequest.
25 сен 14, 16:23    [16621921]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
AntMaria
Member

Откуда:
Сообщений: 12
Glory, да,согласна, но программируется это в SQL - и используются процедуры SQL (в данном случае процедуры SP_OAMethod)...
И вообще, есть подозрения, что это SQL-server портит кодировку...
25 сен 14, 16:38    [16621987]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
Glory
Member

Откуда:
Сообщений: 104751
AntMaria
но программируется это в SQL

Это программируется одинаково на всех языках. Потому что названия методов зависят только от самого COM объекта.
25 сен 14, 16:42    [16622003]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
AntMaria
Member

Откуда:
Сообщений: 12
Glory,
смотрела уже на всех языках - конкретной информации пока не нашла по этой теме...
EXEC @rc=sp_OAMethod @objHTTP,'Option', null,2,'windows-1251;' - это не меняет, а только выводит информацию о кодовой странице;
это тоже не помогает:
SET @accept = 'charset=windows-1251;'
EXEC @rc = sp_OAMethod @objHTTP, 'setRequestHeader', null, 'accept-charset',@accept ...

Если вы такой умный, то помогите решить проблему, а не придирайтесь к тому к какой рубрике это относится...
25 сен 14, 17:22    [16622235]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
Glory
Member

Откуда:
Сообщений: 104751
AntMaria
смотрела уже на всех языках - конкретной информации пока не нашла по этой теме...

Каких "всех языках" ?
Надо чиатать описание WinHttpRequest

AntMaria
Если вы такой умный, то помогите решить проблему, а не придирайтесь к тому к какой рубрике это относится...

А за такие советы тема сейчас прямиком пойдет в другой форум.
25 сен 14, 17:24    [16622254]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
AntMaria
Member

Откуда:
Сообщений: 12
Glory, на сайте http://msdn.microsoft.com/en-us/library/windows/desktop/aa383979(v=vs.85).aspx, где написано о WinHttpRequest - можно сказать живу... Много чего там нашла, но вот эту проблему пока раздолбать не могу - поэтому сюда и написала, надеялась что кто-нибудь уже сталкивался с такой проблемой.
25 сен 14, 17:32    [16622297]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
Glory
Member

Откуда:
Сообщений: 104751
AntMaria
где написано о WinHttpRequest - можно сказать живу..

Что же вы тогда спрашиваете, как понять какое-то свойство ?
25 сен 14, 17:34    [16622310]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
Glory
Member

Откуда:
Сообщений: 104751
1. Как вы убедились, что файл имет правильную кодировку ?
2. Как вы убедились, что в table #t (field VARCHAR(8000)) содержимое файла попало павильно ?
25 сен 14, 17:49    [16622411]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
AntMaria
Member

Откуда:
Сообщений: 12
Glory,
"1. Как вы убедились, что файл имет правильную кодировку ?" - я его сначала выгружаю в файл XML - и все редакторы показывают, что он в правильной кодировке, а потом вообще вставила содержимое файла в тело SQL-запроса - это видно в приведенном примере выше.
"2. Как вы убедились, что в table #t (field VARCHAR(8000)) содержимое файла попало павильно ?" - table #t - это вообще временная таблица уже для ответа, и потом то, что информация приходит не в той кодировке мне сказали специалисты из той компании куда я делаю запрос - это видно в ответном файле (см. выше) - сначала наш запрос в абракадабриках, а в конце - код ошибки и расшифровка ошибки в правильной кодировке.
25 сен 14, 18:04    [16622501]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
AntMaria
Member

Откуда:
Сообщений: 12
Glory
AntMaria
где написано о WinHttpRequest - можно сказать живу..

Что же вы тогда спрашиваете, как понять какое-то свойство ?


- свойство поняла , а как прописать его не знаю, точнее пока не получилось...
25 сен 14, 19:09    [16622796]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
Диам
Member

Откуда:
Сообщений: 1490
AntMaria, решили ли вы свою проблему? Если не сложно - напишите мне на мыло, у меня есть к вам предложение.
ForMyWork@mail.ru
8 окт 14, 23:53    [16679404]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
AntMaria
Member

Откуда:
Сообщений: 12
Диам, проблему решили перекодировкой текста:
DECLARE @ReqData varbinary(MAX)
set @ReqData = CAST(@ReqBody as varbinary(MAX))

и далее везде меняем @ReqBody на @ReqData
и отправляем
exec @rc=sp_OAMethod @objHTTP,'Send',null,@ReqData

Теперь приходит в нормальной кодировке.

Но появилась другая проблема: приходит нормально только короткий ответ в 4 кб, а вместо 40 кб - приходит почему-то NULL.
В чем может быть причина?
1 дек 14, 18:17    [16933235]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8494
AntMaria,

в том, что отсылаете null. Что посылаете, то и приходит.
1 дек 14, 18:24    [16933290]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
AntMaria
Member

Откуда:
Сообщений: 12
Владислав Колосов, в том то и дело, что точно знаем, что на наш запрос отправлятся ответ в 40 кб. - (это нам ответили специалисты куда отсылаем запрос - они отследили по нашему IP-адресу.): если запрос от нас приходит с ошибкой - то в овет приходит 4 кб. , после исправления ошибки - они нам отсылают информацию в полном объеме - т.е. приблизительно 40 кб.), а у нас - NULL. Так что проблема в чем то другом...
2 дек 14, 12:27    [16936448]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
Glory
Member

Откуда:
Сообщений: 104751
AntMaria
Так что проблема в чем то другом...

Отследите, сколько байт приходит с IP адреса "специалистов куда отсылаем запрос"
2 дек 14, 12:33    [16936503]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
AntMaria
Member

Откуда:
Сообщений: 12
Glory, Как отследить?
2 дек 14, 15:01    [16937721]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
Glory
Member

Откуда:
Сообщений: 104751
AntMaria
Glory, Как отследить?

Ну те специалисты как то отследили. С точностью до кбайта.
Наверное каждый байт отлавливали и спрашивали, ты куда
2 дек 14, 15:04    [16937752]     Ответить | Цитировать Сообщить модератору
 Re: отправка xml-файла при помощи WinHttp - уходит в неправильной кодировке UTF-8  [new]
AntMaria
Member

Откуда:
Сообщений: 12
Glory, к сожалению "те специалисты" нам не помогут - они только у себя отлавливают, а остальное мы всё сами должны делать. Наши сисадмины говорят прогу на сервер надо ставить, которой у нас нет, а самим им влом писать или слабо. А можно как-нибудь через Profiler отследить?
2 дек 14, 15:25    [16937930]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить