Ошибка аутентификации при подписке на веб-сервис sharepoint с помощью ksoap2-android - PullRequest
4 голосов
/ 11 мая 2011

Я пишу приложение для Android, которое будет использовать метод getlist () службы lists.amx в sharepoint 2010. Я использую ksoap2-android для обработки своих мыльных сообщений. Когда я пытаюсь аутентифицироваться, я получаю исключение xmlpullparser, ожидаемое START_TAG ... Почему следующий код не аутентифицируется на сервере sharepoint?

Вот мой код:

public class SharepointList extends Activity {
private static final String SOAP_ACTION = "http://schemas.microsoft.com/sharepoint/soap/GetList";
private static final String METHOD_NAME = "GetList";
private static final String NAMESPACE = "http://schemas.microsoft.com/sharepoint/soap/" ;
private static final String URL = "http://<ip of sharepoint server>/_vti_bin/lists.asmx";

private TextView result;
private Button btnSubmit;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    result = (TextView)findViewById(R.id.textView1);
    btnSubmit = (Button)findViewById(R.id.button1);
    btnSubmit.setOnClickListener(new OnClickListener(){
        public void onClick(View v) {
            if(v.getId() == R.id.button1)
            {
                String list = getMobileTestList();
                result.setText(list);
            }

        }

    });


}
private String getMobileTestList()
{
    PropertyInfo pi = new PropertyInfo();
    pi.setName("listName");
    pi.setValue("Mobile Test List");

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    request.addProperty(pi);

    String authentication = android.util.Base64.encodeToString("username:password".getBytes(), android.util.Base64.DEFAULT);
    List<HeaderProperty> headers = new ArrayList<HeaderProperty>();
    headers.add(new HeaderProperty("Authorization","Basic " +authentication));
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);


    HttpTransportSE transport = new HttpTransportSE(URL);
    try
    {
        transport.debug = true;
        transport.call(SOAP_ACTION, envelope, headers);
        //transport.call(SOAP_ACTION, envelope);
        Object result = envelope.getResponse();
        return result.toString();

    }
    catch(Exception e)
    {
        return e.toString();
    }
}
}

Вот transport.requestdump (предшествующий удалению '<'): </p>

Вот транспорт.responsedump (предшествующий «<» удален): </p>

  • ! DOCTYPE HTML PUBLIC "- // W3C // DTD HTML 4.01 // EN" "http://www.w3.org/TR/html4/strict.dtd">
    • HTML>
    • HEAD>
      • НАЗВАНИЕ> Неверный запрос
      • META HTTP-EQUIV = "Content-Type" Content = "text / html; charset = us-ascii">
    • / HEAD>
    • BODY>
      • h2> Неверный запрос - Неверное имя хоста
      • hr> p> Ошибка HTTP 400. Неверное имя хоста запроса.
    • / BODY>
  • / HTML>

1 Ответ

3 голосов
/ 01 июля 2011

Возможно попробуйте следующее:

String authentication = android.util.Base64.encodeToString("username:password".getBytes(), android.util.Base64.NO_WRAP);

По умолчанию утилита Android Base64 добавляет символ новой строки в конец закодированной строки.Это делает недействительными заголовки HTTP и вызывает «неверный запрос».

Флаг Base64.NO_WRAP предотвращает это и сохраняет заголовки в такте.

...