4

SharePoint 2010 で、lists.amx サービスの getlist() メソッドを使用する Android アプリケーションを作成しています。ksoap2-android を使用して SOAP メッセージを処理しています。認証しようとすると、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 です (先行する '<' は削除されています):

  • v:エンベロープ xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http: //schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
    • v:ヘッダー />
    • v:本体>
      • GetList xmlns="http://schemas.microsoft.com/sharepoint/soap/" id="o0" c:root="1">
        • listName i:type="d:string">モバイル テスト リスト
    • /GetList>
    • /v:本体>
  • /v:封筒>

transport.responsedump は次のとおりです (前の「<」は削除されています)。

  • !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
    • HTML>
    • ヘッド>
      • TITLE>不適切なリクエスト
      • META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii">
    • /HEAD>
    • ボディ>
      • h2>不正なリクエスト - 無効なホスト名
      • hr> p>HTTP エラー 400。リクエストのホスト名が無効です。

    • /ボディ>
  • /HTML>
4

1 に答える 1

3

たぶん、次のことを試してください:

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

デフォルトでは、Android Base64 ユーティリティは、エンコードされた文字列の末尾に改行文字を追加します。これにより、HTTP ヘッダーが無効になり、「Bad request」が発生します。

フラグはこれBase64.NO_WRAPを防ぎ、ヘッダーをそのまま維持します。

于 2011-07-01T10:47:34.750 に答える