Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.02.2014, 16:18
cdtj cdtj вне форума
Прохожий
 
Регистрация: 26.06.2012
Сообщения: 16
Версия Delphi: Embarcadero 8.0
Репутация: 132
По умолчанию ArrayOfString, SOAP, Delphi... (Не актуально)

// Тему можно закрыть, проблема как я понял на стороне Web Service Toolkit

Доброго дня всем!

Есть некий web service (WSDL), вроде бы с ним всё хорошо и работает как надо, до тех пор пока не требуется передача параметров в виде массива строк, есть тонкий клиент на php, там с этим проблем нет, а на delphi все вываливается ошибкой.

Вот так всё это хозяйство объявляется на php:
PHP код:
$params = array( 'sid' => $strSessionID
'creatorHandle' => $strHandleID

'attrVals' => array(
'requestor',
'$strHandleID',
'summary',
'summary_here',
'description',
'Description_here',
'priority',
'3',
'category',
'chgcat:400022'
),

итд

Так это выглядит в delphi:
(Класс в котором используется этот массив)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
createRequest_Type = class(TBaseComplexRemotable)
private
  Fsid : integer;
  FcreatorHandle : string;
  FattrVals : ArrayOfString;
  FpropertyValues : ArrayOfString;
  Ftemplate : string;
  Fattributes : ArrayOfString;
  FnewRequestHandle : string;
  FnewRequestNumber : string;
public
  constructor Create();override;
  procedure FreeObjectProperties();override;
published
  property sid : integer read Fsid write Fsid;
  property creatorHandle : string read FcreatorHandle write FcreatorHandle;
  property attrVals : ArrayOfString read FattrVals write FattrVals;
  property propertyValues : ArrayOfString read FpropertyValues write FpropertyValues;
  property template : string read Ftemplate write Ftemplate;
  property attributes : ArrayOfString read Fattributes write Fattributes;
  property newRequestHandle : string read FnewRequestHandle write FnewRequestHandle;
  property newRequestNumber : string read FnewRequestNumber write FnewRequestNumber;
end;

(Класс массива)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ArrayOfString = class(TBaseSimpleTypeArrayRemotable)
private
  FData : array of string;
private
  function GetItem(AIndex: Integer): string;
  procedure SetItem(AIndex: Integer; const AValue: string);
protected
  function GetLength():Integer;override;
  procedure SaveItem(AStore : IFormatterBase;const AName : String;const AIndex : Integer);override;
  procedure LoadItem(AStore : IFormatterBase;const AIndex : Integer);override;
public
  class function GetItemTypeInfo():PTypeInfo;override;
  procedure SetLength(const ANewSize : Integer);override;
  procedure Assign(Source: TPersistent); override;
  property Item[AIndex:Integer] : string read GetItem write SetItem; default;
end;

(Мои попытки объявления (Пробовал задавать напрямую, суть не меняется.))
Код:
1
2
3
4
5
6
7
8
9
10
11
attrVals := ArrayOfString.create();
attrVals.SetLength(8);
attrVals[0] := 'customer';
attrVals[1] := 'cnt:D690862CF94AFC4B9819AE61359E0B9E';
attrVals[2] := 'category';
attrVals[3] := 'pcat:400437';
attrVals[4] := 'assignee';
attrVals[5] := 'cnt:D690862CF94AFC4B9819AE61359E0B9E';
attrVals[6] := 'group';
attrVals[7] := 'cnt:BDAC9FFB5074014FAAAB0A1162BFF55C';
crType.attrVals.Assign(attrVals);

Код ошибки:
ESOAPException:
code = 'soapenv:Server.userException';
message = 'org.xml.sax.saxexception: Invalid element is usdjws65.ArrayOfString - _string'.

Декомпилировал ява файл на всякий:
Код:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package usdjws65;
 
import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.Arrays;
import javax.xml.namespace.QName;
import org.apache.axis.description.ElementDesc;
import org.apache.axis.description.TypeDesc;
import org.apache.axis.encoding.Deserializer;
import org.apache.axis.encoding.Serializer;
import org.apache.axis.encoding.ser.BeanDeserializer;
import org.apache.axis.encoding.ser.BeanSerializer;
 
public class ArrayOfString
  implements Serializable
{
  static final long serialVersionUID = -1L;
  private String[] string;
  private Object __equalsCalc = null;
  private boolean __hashCodeCalc = false;
  private static TypeDesc typeDesc = new TypeDesc(ArrayOfString.class);
   
  public String[] getString()
  {
    return this.string;
  }
   
  public void setString(String[] paramArrayOfString)
  {
    this.string = paramArrayOfString;
  }
   
  public String getString(int paramInt)
  {
    return this.string[paramInt];
  }
   
  public void setString(int paramInt, String paramString)
  {
    this.string[paramInt] = paramString;
  }
   
  public synchronized boolean equals(Object paramObject)
  {
    if (!(paramObject instanceof ArrayOfString)) {
      return false;
    }
    ArrayOfString localArrayOfString = (ArrayOfString)paramObject;
    if (paramObject == null) {
      return false;
    }
    if (this == paramObject) {
      return true;
    }
    if (this.__equalsCalc != null) {
      return this.__equalsCalc == paramObject;
    }
    this.__equalsCalc = paramObject;
    boolean bool = ((this.string == null) && (localArrayOfString.getString() == null)) || ((this.string != null) && (Arrays.equals(this.string, localArrayOfString.getString())));
    this.__equalsCalc = null;
    return bool;
  }
   
  public synchronized int hashCode()
  {
    if (this.__hashCodeCalc) {
      return 0;
    }
    this.__hashCodeCalc = true;
    int i = 1;
    if (getString() != null) {
      for (int j = 0; j < Array.getLength(getString()); j++)
      {
        Object localObject = Array.get(getString(), j);
        if ((localObject != null) && (!localObject.getClass().isArray())) {
          i += localObject.hashCode();
        }
      }
    }
    this.__hashCodeCalc = false;
    return i;
  }
   
  public static TypeDesc getTypeDesc()
  {
    return typeDesc;
  }
   
  public static Serializer getSerializer(String paramString, Class paramClass, QName paramQName)
  {
    return new BeanSerializer(paramClass, paramQName, typeDesc);
  }
   
  public static Deserializer getDeserializer(String paramString, Class paramClass, QName paramQName)
  {
    return new BeanDeserializer(paramClass, paramQName, typeDesc);
  }
   
  static
  {
    typeDesc.setXmlType(new QName("http://www.ca.com/UnicenterServicePlus/ServiceDesk", "ArrayOfString"));
    ElementDesc localElementDesc = new ElementDesc();
    localElementDesc.setFieldName("string");
    localElementDesc.setXmlName(new QName("", "string"));
    localElementDesc.setXmlType(new QName("http://www.w3.org/2001/XMLSchema", "string"));
    typeDesc.addFieldDesc(localElementDesc);
  }
}

Последний раз редактировалось cdtj, 07.03.2014 в 08:06.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:20.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025